【问题标题】:Test for a resource type of a dbpedia page using rdflib and python使用 rdflib 和 python 测试 dbpedia 页面的资源类型
【发布时间】:2014-03-18 01:42:56
【问题描述】:

我正在使用 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,但我仍然想检查这是一个人而不是水果,例如:)

新手,所以任何帮助表示赞赏。

【问题讨论】:

    标签: python dbpedia rdflib


    【解决方案1】:

    不使用 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)
    

    【讨论】:

    • 您好,感谢您的回答,它显然完全符合我的要求。是否可以使用相同的方法说“这不是一个人,它是一种水果”,或者更简单:) 感谢您抽出宝贵的时间,我的小测试脚本得到了显着改进。
    • 无法无天我没有足够的社交能力来给你的答案打分,但它就像做梦一样。我对 SPARQL 不熟悉,但认为术语 ASK{?uri a ?person} 翻译为一个人的 uri,并将答案存储在 initBindings{'uri': uri, 'person': person} 魔术做什么?
    • initBindings 将这些键值传递给您的 sparql 查询。所以当sparql查询运行时,?uri<http://dbpedia.org/resource/Richard_Nixon>替换,?person<http://dbpedia.org/ontology/Person>替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多