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

1 投票
1 回答
1629 浏览
提问于 2025-04-17 22:45

我正在用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)

撰写回答