使用rdflib和python测试dbpedia页面的资源类型

时间:2014-03-18 01:42:56

标签: python dbpedia rdflib

我正在使用python中的RDFlib从用户输入的dbpedia页面中提取数据,并且正在努力寻找一种方法来测试以查看该页面是关于一个人的。我确信这很容易,并且可以使用测试,例如页面有出生日期的资源,但这似乎是一个kludge。

有没有直接的方法来执行此操作,最好不使用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但我仍然想检查这是一个人而不是水果,例如:)

对此有所了解所以任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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)