我正在使用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但我仍然想检查这是一个人而不是水果,例如:)
对此有所了解所以任何帮助表示赞赏。
答案 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)