4

我正在尝试使用 sparql 从 dbpedia 中提取包含人名等的实体字典。

PREFIX owl: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
SELECT ?name
WHERE {
    ?person a owl:Person .

    ?person dbpprop:name ?name . FILTER(lang(?name) = "en")
}

上面的查询确实成功了,但是当我将语言名称更改为 时fr,没有什么可以获取的。

如何获取其他语言的名称?

此外,为什么我不能使用下面的查询过滤语言?

SELECT ?name
WHERE {
    ?person a owl:Person .
    ?person dbpprop:language "English"
    ?person dbpprop:name ?name . 
}
// this query returns nothing

我尝试使用

SELECT DISTINCT ?lanName
WHERE {
    ?person a owl:Person .
    ?person dbpprop:language ?lanName .
}

结果集包含English.

4

2 回答 2

5

您需要根据属性值的语言进行过滤。不是每个属性都有不同语言的值,但有些属性会有。从您的示例看来,dbpprop:name似乎在每种语言中都没有值。如果您查看其他语言特定的 DBpediae,您可能会在其他语言中找到更多值。

但是,对于名称之类的内容,如果使用rdfs:label属性,您可能会得到多语言结果。例如,要获得俄文中巴拉克奥巴马、丹尼尔韦伯斯特和约翰尼卡什的姓名,您可以执行以下操作:

select ?label {
  values ?person { dbpedia:Johnny_Cash dbpedia:Barack_Obama dbpedia:Daniel_Webster }
  ?person rdfs:label ?label .
  filter langMatches(lang(?label),"ru")
}

SPARQL 结果

顺便说一句,请注意使用langMatches而不是相等来匹配语言标签。这通常是一种更好的方法,因为它可以正确处理一种语言中的不同语言标签。例如(来自 SPARQL 规范),您可以找到两种法语文字:

"Cette Série des Années Soixante-dix"@fr .
"Cette Série des Années Septante"@fr-BE .

使用langMatches(lang(?title),"fr"),但只有第一个使用lang(?title) = "fr"

于 2015-03-16T15:14:12.437 回答
0

你在找rdfs:label一个名字,当然所有的名字都是英文的,你看的是英文的dbpedia。

PREFIX owl: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
SELECT distinct *
WHERE {
    ?person a owl:Person .
    ?person rdfs:label ?name . 
    FILTER(lang(?name) = "fr")
}

同样,对于第二个,如果将名称替换为 ,则rdfs: label可以:

    PREFIX owl: <http://dbpedia.org/ontology/>
    PREFIX dbpprop: <http://dbpedia.org/property/>
    SELECT distinct *
        WHERE {
    ?person a owl:Person .
    ?person rdfs:label ?name .
    ?person dbpprop:language <http://dbpedia.org/resource/English_language>.
}
于 2015-03-16T10:00:03.720 回答