我一直试图在rdflib图上运行查询(从schema.org加载schema.rdfa)来查找祖先。
E.g。
根据{{3}},祖先是
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
。
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'),)
]
'''
当我将查询转换为准备好的查询时,我最初注意到了这个问题,并且不得不使用initBindings替换&#34; subject&#34;。我已将其缩小为initBindings问题,而不是prepareQuery问题,因此删除了准备好的查询编译。
这两个查询不应该产生完全相同的结果吗?
我已将Schema for Corporation视为可能的副本,但我使用的是initBindings
,但仍然存在这种不一致的情况。