Rdflib,Python:是否有任何对象框架方法可以从图形a-la JSON-LD获取嵌套的dict / list结构?

时间:2015-05-09 08:16:32

标签: python rdflib

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有类似的东西吗?

2 个答案:

答案 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(关联数据平台)是更先进的方法。