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 (または人であると考えているクラス) がそれらの 1 つであることを確認できます。コードは次のようになります。

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 に答える