Rdflib CONSTRUCT查询返回表示图形的元组列表。但是,模板语言通常最方便的是嵌套混合dicts和列表的树状结构(因为该结构与HTML标记的树状结构很好地匹配)。实际上,SELECT在这方面并不是更好,而是相同数据的非规范化版本。
很容易想出一些临时转型,但也许有一些惯用的方法给出了图表和一些提示" pivotots",它会产生一棵树?
例如,如果我们有一个包含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中使用的那样:
框架是获取JSON-LD文档的过程,该文档表示信息图,并应用特定的图形布局(称为框架)。
JSON-LD框架允许开发人员通过示例进行查询,并将特定树布局强制为JSON-LD文档。
所以,这里需要的是rdflib,Python中框架的某种方式。 This document(" JSON-LD:循环破坏和对象框架")给出了我的问题所寻求的内容的流行解释,但对于Python有类似的东西吗?
答案 0 :(得分:1)
SPARQLWrapper2
课程可以实现您的要求。遗憾的是docs至少可以理解它有点“复杂”。但是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')
。
答案 1 :(得分:1)
“对象框架”允许通过JSON-LD将RDF模型中的文档转换为树形,更适合某些应用场景由pyld库提供:
https://github.com/digitalbazaar/pyld
结果图可以序列化为JSON-LD,给定所谓的 context (JSON-LD终结),然后给出 frame (还有一个JSON- LD术语,涵盖in the draft):
jsonld.frame(doc, frame)
将生成一个“框架”数据结构,实际上是一个具有固定布局的树,可供应用程序使用。
对于更具体的情况,如树状GUI生成场景,Fresnel Vocabulary应该是“RDF方式”。但是,How to display RDF data described by Fresnel vocabulary?表明,LDP(关联数据平台)是更先进的方法。