我正在尝试使用rdflib以编程方式分析SPARQL 1.1 UPDATE查询。
使用以下(Python 3.5)代码:
from rdflib.plugins.sparql.parser import parseUpdate
from pprint import pprint
qs = '''DELETE {
<> a <urn:type:A> , <urn:type:b> ;
<urn:p:a> ?x .
} INSERT {
<> <urn:p:a> "hello" .
} WHERE {
<> <urn:p.a> ?x .
}'''
q = parseUpdate(qs)
pprint(q)
我得到以下结果:
{'prologue': [([], {})],
'request': [{'delete': {'quads': {'triples': [([rdflib.term.URIRef(''), rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdflib.term.URIRef('urn:type:B'), rdflib.term.URIRef(''), rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdflib.term.URIRef('urn:type:C'), rdflib.term.URIRef(''), rdflib.term.URIRef('urn:p:b'), rdflib.term.Variable('x')], {})]}},
'insert': {'quads': {'triples': [([rdflib.term.URIRef(''), rdflib.term.URIRef('urn:p:b'), literal_{'string': rdflib.term.Literal('hello')}], {})]}},
'where': {'part': [{'triples': [([rdflib.term.URIRef(''), PathAlternative_{'part': [PathSequence_{'part': [PathElt_{'part': rdflib.term.URIRef('urn:p:b')}]}]}, rdflib.term.Variable('x')], {})]}]}}]}
这种种有意义,但它非常笨重。其中最难以理解的部分是每个语句的所有术语都被压入一个列表而不是被三元组分割。
我查看了RDFlib的(相当缺乏的)文档,甚至在负责此解析的源代码中寻找一些方便的方法来提取每个语句的三元组,但无济于事。
寻找替代和更好记录的方法来做到这一点,我阅读Parsing SPARQL queries并查看了替代库,但它们似乎都是alpha或死的。
有没有人有任何指示来理解上述数据结构?
非常感谢。