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

时间:2016-03-04 01:16:19

标签: python-2.7 rdflib

我刚刚开始自学RDF和Python rdflib库。但我遇到了以下代码的问题。我希望查询将标记 nat 作为人员返回,并且只将 natalie 作为教授返回。我无法看到我出错的地方。 (顺便说一句,我知道教授应该是一个头衔,而不是一种人,但我只是修补自动取款机。)任何帮助表示赞赏。感谢。

rdflib 4,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
>>> 

1 个答案:

答案 0 :(得分:1)

您的查询带回了所有类型,因为?prof变量未绑定到某个值。

我认为您想要使用的是initBindings kwarg来传递'教授'对你的查询。因此,将查询更改为以下内容只会检索natalie

qres = G.query( """SELECT DISTINCT ?aname WHERE { ?a rdf:type ?prof . ?a foaf:firstName ?aname . }""", initNs ={"rdf": RDF,"foaf": FOAF}, initBindings={"prof": URIRef('Professor')})