Rdflib,Python:是否有任何对象框架方法可以从图 a-la JSON-LD 中获取嵌套 dict/list 结构?
Rdflib, Python: Are there any object framing methods to get nested dict/list structure from a graph a-la JSON-LD?
Rdflib CONSTRUCT 查询 returns 表示图形的元组列表。然而,模板语言通常最方便的是嵌套混合字典和列表的树状结构(因为该结构与 HTML 标记的树状结构非常匹配)。实际上,SELECT在这方面并没有更好,而是相同数据的非规范化版本。
想出一些特别的转换是很容易的,但也许有一些惯用的方法给出了图形和一些“枢轴”的提示,这会产生一棵树?
例如,如果我们有一个图,包含 Query 和 ResultVar 个体(具有数据属性,如标签等),那么树可以是带有 ResultVar 子项的 Query 列表:
[
{'name': 'q1', 'uri': '...', 'children':
[{'name': 'x', 'value': '1', ... },
{'name': 'y', 'value': '1', ... },
...
]},
...
]
为此,我们可能会提示使用 Query - ResultVar 命令的方法。结果很容易与嵌套的“循环”一起使用,它在模板中生成 HTML 标记。
我不喜欢重新发明轮子,我想这种问题不是唯一的,但我还没有找到任何解决方案。
但是,我不想要 ORM 方法,因为它意味着在代码中有模式,我不想硬连接它。
编辑:为了澄清可能的误解,Query / ResultVar 只是一个例子。我可以改用博客/评论或日历/活动。
EDIT2
好像这里要找的是object framing,用在JSON-LD:
Framing is the process of taking a JSON-LD document, which expresses a graph of information, and applying a specific graph layout (called a Frame).
JSON-LD Framing allows developers to query by example and force a specific tree layout to a JSON-LD document.
所以,这里需要的是在 rdflib,Python 中 framing 的一些方法。 This document ("JSON-LD: Cycle Breaking and Object Framing") 对我的问题所寻求的内容给出了一个通俗的解释,但是对于 Python 是否有类似的解释?
SPARQLWrapper2
class可以实现您的要求。可悲的是 docs for it are a bit "complicated" to understand to say the least. But there's a nice example in the overall docs:
from SPARQL import SPARQLWrapper2
queryString = "SELECT ?subj ?o ?opt WHERE { ?subj <http://a.b.c> ?o. OPTIONAL { ?subj <http://d.e.f> ?opt }}"
sparql = SPARQLWrapper2("http://localhost:2020/sparql")
# add a default graph, though that can also be in the query string
sparql.addDefaultGraph("http://www.example.com/data.rdf")
sparql.setQuery(queryString)
try :
ret = sparql.query()
print ret.variables # this is an array consisting of "subj", "o", "opt"
if (u"subj",u"prop",u"opt") in ret :
# there is at least one binding covering the optional "opt", too
bindings = ret[u"subj",u"o",u"opt"]
# bindings is an array of dictionaries with the full bindings
for b in bindings :
subj = b[u"subj"].value
o = b[u"o"].value
opt = b[u"opt"].value
# do something nice with subj, o, and opt
# another way of accessing to values for a single variable:
# take all the bindings of the "subj"
subjbind = ret.getValues(u"subj") # an array of Value instances
...
except:
deal_with_the_exception()
如此适合您的情况,您可以使用 children = ret.getValues(u'q1')
。
"Object framing",允许通过JSON-LD将RDF模型中的文档转换为树形,pyld库提供了更适合某些应用场景的文档:
https://github.com/digitalbazaar/pyld
结果图可以序列化为JSON-LD,给定所谓的context(JSON-LD术语),然后,给定一个frame(又一个JSON-LD术语,涵盖in the draft):
jsonld.frame(doc, frame)
会产生一个"framed"数据结构,其实就是一个布局固定的树,供应用程序使用。
对于更具体的情况,例如树状 GUI 生成场景,Fresnel Vocabulary is supposed to be "the RDF way". However, How to display RDF data described by Fresnel vocabulary? 建议,LDP(关联数据平台)是更高级的方法。
Rdflib CONSTRUCT 查询 returns 表示图形的元组列表。然而,模板语言通常最方便的是嵌套混合字典和列表的树状结构(因为该结构与 HTML 标记的树状结构非常匹配)。实际上,SELECT在这方面并没有更好,而是相同数据的非规范化版本。
想出一些特别的转换是很容易的,但也许有一些惯用的方法给出了图形和一些“枢轴”的提示,这会产生一棵树?
例如,如果我们有一个图,包含 Query 和 ResultVar 个体(具有数据属性,如标签等),那么树可以是带有 ResultVar 子项的 Query 列表:
[
{'name': 'q1', 'uri': '...', 'children':
[{'name': 'x', 'value': '1', ... },
{'name': 'y', 'value': '1', ... },
...
]},
...
]
为此,我们可能会提示使用 Query - ResultVar 命令的方法。结果很容易与嵌套的“循环”一起使用,它在模板中生成 HTML 标记。
我不喜欢重新发明轮子,我想这种问题不是唯一的,但我还没有找到任何解决方案。
但是,我不想要 ORM 方法,因为它意味着在代码中有模式,我不想硬连接它。
编辑:为了澄清可能的误解,Query / ResultVar 只是一个例子。我可以改用博客/评论或日历/活动。
EDIT2 好像这里要找的是object framing,用在JSON-LD:
Framing is the process of taking a JSON-LD document, which expresses a graph of information, and applying a specific graph layout (called a Frame).
JSON-LD Framing allows developers to query by example and force a specific tree layout to a JSON-LD document.
所以,这里需要的是在 rdflib,Python 中 framing 的一些方法。 This document ("JSON-LD: Cycle Breaking and Object Framing") 对我的问题所寻求的内容给出了一个通俗的解释,但是对于 Python 是否有类似的解释?
SPARQLWrapper2
class可以实现您的要求。可悲的是 docs for it are a bit "complicated" to understand to say the least. But there's a nice example in the overall docs:
from SPARQL import SPARQLWrapper2
queryString = "SELECT ?subj ?o ?opt WHERE { ?subj <http://a.b.c> ?o. OPTIONAL { ?subj <http://d.e.f> ?opt }}"
sparql = SPARQLWrapper2("http://localhost:2020/sparql")
# add a default graph, though that can also be in the query string
sparql.addDefaultGraph("http://www.example.com/data.rdf")
sparql.setQuery(queryString)
try :
ret = sparql.query()
print ret.variables # this is an array consisting of "subj", "o", "opt"
if (u"subj",u"prop",u"opt") in ret :
# there is at least one binding covering the optional "opt", too
bindings = ret[u"subj",u"o",u"opt"]
# bindings is an array of dictionaries with the full bindings
for b in bindings :
subj = b[u"subj"].value
o = b[u"o"].value
opt = b[u"opt"].value
# do something nice with subj, o, and opt
# another way of accessing to values for a single variable:
# take all the bindings of the "subj"
subjbind = ret.getValues(u"subj") # an array of Value instances
...
except:
deal_with_the_exception()
如此适合您的情况,您可以使用 children = ret.getValues(u'q1')
。
"Object framing",允许通过JSON-LD将RDF模型中的文档转换为树形,pyld库提供了更适合某些应用场景的文档:
https://github.com/digitalbazaar/pyld
结果图可以序列化为JSON-LD,给定所谓的context(JSON-LD术语),然后,给定一个frame(又一个JSON-LD术语,涵盖in the draft):
jsonld.frame(doc, frame)
会产生一个"framed"数据结构,其实就是一个布局固定的树,供应用程序使用。
对于更具体的情况,例如树状 GUI 生成场景,Fresnel Vocabulary is supposed to be "the RDF way". However, How to display RDF data described by Fresnel vocabulary? 建议,LDP(关联数据平台)是更高级的方法。