如何使用DBpedia知道字符串是否是人的正确名称或地名?

时间:2013-05-29 10:33:38

标签: sparql semantic-web dbpedia

我在DBpedia上使用SPARQL查询到Prolog项目,我有一个疑问。我想知道一个词是否很可能是一个一个人的名字(类似于:John,Mario)或 PLACE (就像一个城市:罗马,伦敦,纽约)。

我实现了以下两个查询,第一个给出了具有特定名称的人数,第二个给了我具有特定名称的地点数。

1)查询PERSON NAME:

select COUNT(?person) where {
  ?person a dbpedia-owl:Person .
  { ?person foaf:givenName "John"@en }
  UNION 
  { ?person foaf:surname "John"@en }
}

对于名称 John ,我获得以下输出: callret-0:7313 ,所以我认为它找到了正确名称John的7313个实例。是不是?

2)查询PLACE NAME:

select COUNT(?place) where {
   ?place a dbpedia-owl:Place .
   { ?x rdfs:label "John"@en }
}

问题在于,正如您在上一个“地点”查询中所看到的,我已插入 John 作为参数,这不是地名,而是人员的正确名称,但我获得了以下奇怪的结果: callret-0:81900104

问题是,通过这种方式,如果我比较前两个查询的输出,似乎John是一个地方,而不是一个人名!这对我的范围不利;我尝试过使用其他个人名称,并且总是会发生地点查询给出比名称查询更大的输出。

为什么呢?我错过了什么?我的查询中是否存在错误?如何解决它才能得到正确的结果?

1 个答案:

答案 0 :(得分:4)

实际上,当我运行您提供的查询时:

select COUNT(?place) where {
   ?place a dbpedia-owl:Place .
   { ?x rdfs:label "John"@en }
}

我得到的结果是93027312,而不是81900104,但这并不重要。奇怪的结果出现是因为?x?place不必绑定到同一个东西,所以你得到所有dbpedia-owl:Places并计算它们,但结果行的数量是dbpedia-owl:Place 的数量乘以<{1}}的数量乘以

rdfs:label "John@en"

如果您确实要求select COUNT(?place) where { ?place a dbpedia-owl:Place } => 646023 select COUNT(?x) where { ?x rdfs:label "John"@en } => 144 646023 × 144 = 93027312 拥有dbpedia-owl:Place,那么您将无法获得结果:

rdfs:label "John@en"

SPARQL results

此外,您可以考虑使用select COUNT(?place) as ?numPlaces where { ?place a dbpedia-owl:Place ; rdfs:label "John"@en . } 代替dbpprop:name。有些结果似乎更有用。例如,让我们找到名为rdfs:label的地方。如果我们要求有这个名字的地方,我们就没有结果:

"Springfield"

SPARQL results

但是,如果我们修改查询并使用select * where { ?place a dbpedia-owl:Place ; rdfs:label "Springfield"@en . } ,我们会得到17.其中一些是重复的,因此您可能需要做其他事情来删除重复项。但问题是,dbpprop:name得到了一些结果,dbpprop:name没有得到。

rdfs:label

SPARQL results

你甚至可以使用select * where { ?place a dbpedia-owl:Place ; dbpprop:name "Springfield"@en . } 来处理人名,虽然它没那么有用,因为大多数人的dbpprop:name值都是他们的全名。要使用dbpprop:name查找具有给定名称John的人,需要查询:

dbpprop:name

(或者您可以使用CONTAINS而不是STRSTARTS),但这会变得更加 更昂贵,因为它必须选择所有人及其名称,然后过滤该集合。能够根据特定名称选择人员(例如,使用select * where { ?place a dbpedia-owl:Person ; dbpprop:name ?name . FILTER( STRSTARTS( str( ?name ), "John" ) ) } )会更有效率。