Python 2.7 rdflib SPARQL查询(涉及子类)的行为不符合预期

Python 2.7 rdflib SPARQL查询(涉及子类)的行为不符合预期,python-2.7,rdflib,Python 2.7,Rdflib,我刚刚开始自学RDF和Python rdflib库。但是我遇到了以下代码的问题。我希望这些问题会把马克和纳特作为个人,而只把娜塔莉作为教授。我看不出哪里出了问题。(顺便说一句,我知道教授应该是一个头衔,而不是一种人,但我只是在修补ATM机。)感谢您的帮助。谢谢 RDFLIB4,Python 2.7 >>> from rdflib import Graph, BNode, URIRef, Literal INFO:rdflib:RDFLib Version: 4.2. >&

我刚刚开始自学RDF和Python rdflib库。但是我遇到了以下代码的问题。我希望这些问题会把马克和纳特作为个人,而只把娜塔莉作为教授。我看不出哪里出了问题。(顺便说一句,我知道教授应该是一个头衔,而不是一种人,但我只是在修补ATM机。)感谢您的帮助。谢谢

RDFLIB4,Python 2.7

>>> from rdflib import Graph, BNode, URIRef, Literal
INFO:rdflib:RDFLib Version: 4.2.
>>> from rdflib.namespace import RDF, RDFS, FOAF
>>> G = Graph()
>>> mark = BNode()
>>> nat = BNode()
>>> G.add((mark, RDF.type, FOAF.Person))
>>> G.add((mark, FOAF.firstName, Literal('mark')))
>>> G.add((URIRef('Professor'), RDF.type, RDFS.Class))
>>> G.add((URIRef('Professor'), RDFS.subClassOf, FOAF.Person))
>>> G.add((nat, RDF.type, URIRef('Professor')))
>>> G.add((nat, FOAF.firstName, Literal('natalie')))
>>> qres = G.query(
        """SELECT DISTINCT ?aname
           WHERE {
              ?a rdf:type foaf:Person .
              ?a foaf:firstName ?aname .
           }""", initNs = {"rdf": RDF,"foaf": FOAF})
>>> for row in qres:
    print "%s is a person" % row


mark is a person
>>> qres = G.query(
        """SELECT DISTINCT ?aname
           WHERE {
              ?a rdf:type ?prof .
              ?a foaf:firstName ?aname .
           }""", initNs = {"rdf": RDF,"foaf": FOAF, "prof": URIRef('Professor')})
>>> for row in qres:
    print "%s is a Prof" % row


natalie is a Prof
mark is a Prof
>>> 

您的查询正在返回所有类型,因为
?prof
变量未绑定到值

我认为您希望使用的是kwarg,将“Professor”的URI传递给您的查询。因此,将查询更改为以下仅检索
natalie


qres=G.query(
“”“选择不同的?名称”
在哪里{
?rdf:类型?教授。
一个foaf:名字?阿纳姆。
}""",
initNs={“rdf”:rdf,“foaf”:foaf},
initBindings={“prof”:URIRef('Professor')}

是的,完全正确。另一件我不明白的事情是为什么natalie没有通过子类关系被认作一个人。但我认为答案是rdflib SPARQL引擎根本不执行这种推理。干杯。我也可以对姓名个人使用initBindings吗?@msc87您也可以对示例查询中的
?aname
变量使用此选项。您需要通过init绑定传入RDFLib
Literal
。So:initBindings={“aname”:Literal('natalie')})