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 是否有类似的解释?

SPARQLWrapper2class可以实现您的要求。可悲的是 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(关联数据平台)是更高级的方法。