Python 使用initBindings时rdflib SPARQL查询的不同输出

Python 使用initBindings时rdflib SPARQL查询的不同输出,python,sparql,rdflib,Python,Sparql,Rdflib,我一直在尝试在rdflib图(从schema.org加载schema.rdfa)上运行一个查询来查找祖先 例如。 按照祖先的说法是 事物组织公司 这段代码工作得很好,提供了我想要的输出,只是它不使用initBindings,而且我必须格式化查询字符串 import rdflib subject = rdflib.term.URIRef('http://schema.org/Corporation') inplace_query = ''' SELECT ?class where { &l

我一直在尝试在rdflib图(从schema.org加载schema.rdfa)上运行一个查询来查找祖先

例如。 按照祖先的说法是
事物
组织
公司

这段代码工作得很好,提供了我想要的输出,只是它不使用initBindings,而且我必须格式化查询字符串

import rdflib
subject = rdflib.term.URIRef('http://schema.org/Corporation')
inplace_query = '''
SELECT ?class where {
    <%(subject_uri)s> rdfs:subClassOf* ?mid .
    ?mid rdfs:subClassOf* ?class .
}
group by ?class
order by count(?mid)
'''
iq = inplace_query % dict(subject_uri=subject.toPython())
print iq
# This prints out the following
'''
SELECT ?class where {
    <http://schema.org/Corporation> rdfs:subClassOf* ?mid .
    ?mid rdfs:subClassOf* ?class .
}
group by ?class
order by count(?mid)
'''

graph = rdflib.Graph()
graph.load("schema.rdfa", format="rdfa")
print list(graph.query(iq, initNs={"rdfs": "http://www.w3.org/2000/01/rdf-schema#"}))
# This prints out the following which is correct
'''
[
    (rdflib.term.URIRef(u'http://schema.org/Corporation'),),
    (rdflib.term.URIRef(u'http://schema.org/Organization'),),
    (rdflib.term.URIRef(u'http://schema.org/Thing'),)
]
'''
当我将查询转换为准备好的查询时,我最初注意到了这个问题,并且不得不使用initBindings替换“subject”。我已经将其缩小为initBindings问题,而不是preparedQuery问题,因此删除了preparedQuery编译

这两个查询不应该产生完全相同的结果吗


我已经考虑过一个可能的副本,但我使用的是
initBindings
,仍然存在这种不一致性。

不知道这里发生了什么,但您在测试和调试中做得很好。在使用initBindings时,有没有办法查看实际创建的查询?initBindings最近在rdflib 4.2.2发行版中得到了修复,我希望这能解决您的问题不知道这里发生了什么,但您在测试和调试方面做得很好。在使用initBindings时,有没有办法查看实际创建的查询?initBindings最近在rdflib 4.2.2版本中得到了修复,我希望这可以解决您的问题
import rdflib
from rdflib.plugins.sparql import prepareQuery
subject = rdflib.term.URIRef('http://schema.org/Corporation')
prepared_query_str = '''
SELECT ?class where {
    ?subject rdfs:subClassOf* ?mid .
    ?mid rdfs:subClassOf* ?class .
}
group by ?class
order by count(?mid)
'''
print prepared_query_str
# This prints the following output
'''
SELECT ?class where {
        ?subject rdfs:subClassOf* ?mid .
            ?mid rdfs:subClassOf* ?class .
}
group by ?class
order by count(?mid)
'''

graph = rdflib.Graph()
graph.load("schema.rdfa", format="rdfa")
print list(
    graph.query(
        prepared_query_str,
        initNs={"rdfs": "http://www.w3.org/2000/01/rdf-schema#"},
        initBindings={"subject": subject},
    )
)
# This prints out the following which is not correct ! Place does not belong here
'''
[
    (rdflib.term.URIRef(u'http://schema.org/Corporation'),),
    (rdflib.term.URIRef(u'http://schema.org/Place'),),
    (rdflib.term.URIRef(u'http://schema.org/Organization'),),
    (rdflib.term.URIRef(u'http://schema.org/Thing'),)
]
'''