使用rdflib和Python测试dbpedia页面的资源类型
我正在用Python中的RDFlib从用户输入的dbpedia页面提取数据,但我在找出这个页面是否关于一个人的时候遇到了困难。我觉得这应该很简单,比如可以检查一下这个页面是否有出生日期的资源,但这样做感觉有点笨。
有没有更简单的方法来做到这一点,最好是不使用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"
并不是所有记录都有出生名字,但我还是想确认一下这个页面是关于一个人的,而不是比如说水果之类的 :)
我还是新手,所以任何帮助都很感激。
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)