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

2024-09-26 18:11:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图在rdflib图上运行一个查询(加载了架构.rdfa从架构.org)去寻找祖先。在

例如。 根据Schema for Corporation,祖先是
Thing>;Organization>;Corporation
这段代码工作得很好,给了我想要的输出,只是它不使用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,但是给了我一个额外的术语http://schema.org/Place。在

^{pr2}$

我最初在将查询转换为准备好的查询时注意到了这个问题,因此不得不使用initBindings替换“subject”。我把它缩小到initBindings问题而不是preparedQuery问题,因此删除了preparedQuery编译。在

这两个查询不应该得到完全相同的结果吗?在

我已经把this s/o question看作是一个可能的重复,但是我使用initBindings仍然得到这个不合适的地方。在


Tags: orghttpbyschemardflibclasssubjectterm

热门问题