1

我正在使用 Python 中的 RDFlib 从用户输入的 dbpedia 页面中提取数据,并且正在努力寻找一种方法来测试该页面是否与一个人有关。我确信这很容易,并且可以使用测试,例如页面是否有birthDate 的资源,但这似乎是一个杂项。

有没有一种直接的方法可以在不使用 SPARQL 的情况下做到这一点

我的代码类似于

from rdflib import Graph, URIRef
URI_ref = 'http://dbpedia.org/resource/Richard_Nixon'
g = Graph()
g.parse(URI_ref)

for info in g.subject_objects(URIRef("http://dbpedia.org/ontology/birthName"))
    print "This person ", str(info[0]), "was named ", str(info[1]), "at birth"

并非所有记录都有birthName,但我仍然想检查这是一个人而不是水果,例如:)

对此新手,任何帮助表示赞赏。

4

1 回答 1

2

在不使用 SPARQL 的情况下,您可以找到资源的所有类型断言并验证 dbpedia:Person(或您认为是人的任何类)是其中之一。代码看起来像这样。

from rdflib import Graph, URIRef, RDF
uri = URIRef('http://dbpedia.org/resource/Richard_Nixon')
person = URIRef('http://dbpedia.org/ontology/Person')

g = Graph()
g.parse(uri)

for obj in g.objects(subject=uri, predicate=RDF.type):
    if obj == person:
        print uri, "is a", person

您要求的答案不使用 SPARQL,但对从 DBpedia 获取的数据运行 SPARQL 查询是一种非常干净的方法。这是该方法的示例代码:

from rdflib import Graph, URIRef

def is_person(uri):
    uri = URIRef(uri)
    person = URIRef('http://dbpedia.org/ontology/Person')
    g = Graph()
    g.parse(uri)
    resp = g.query(
        "ASK {?uri a ?person}",
        initBindings={'uri': uri, 'person': person}
    )
    print uri, "is a person?", resp.askAnswer
    return resp.askAnswer


uri = URIRef('http://dbpedia.org/resource/Richard_Nixon')
person = URIRef('http://dbpedia.org/ontology/Person')

nixon = 'http://dbpedia.org/resource/Richard_Nixon'
is_person(nixon)

pear = 'http://dbpedia.org/resource/Pear'
is_person(pear)
于 2014-03-18T05:59:12.770 回答