2

我正在将 DBpedia 上的 SPARQL 查询用于 Prolog 项目,但我有疑问。我会知道一个词最有可能是一个人的名字(比如:约翰、马里奥)或一个地方(比如一个城市:罗马、伦敦、纽约)。

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

1)查询人名:

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) 查询地点名称:

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

问题是,正如您在前面的“地点”查询中看到的,我插入了John作为参数,这不是地名而是人名,但我得到了以下奇怪的结果:callret-0: 81900104

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

为什么?我错过了什么?我的查询中有一些错误吗?我怎样才能解决它以获得正确的结果?

4

1 回答 1

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 乘以事物数的数量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:Places 的 s rdfs:label "John@en",您将不会得到任何结果:

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

SPARQL 结果

此外,您可以考虑使用dbpprop:name而不是rdfs:label. 有些结果似乎这样更有用。例如,让我们找到名为 的地方"Springfield"。如果我们询问具有该名称的地点,我们不会得到任何结果:

select * where {
   ?place a dbpedia-owl:Place ;
          rdfs:label "Springfield"@en .
}

SPARQL 结果

但是,如果我们修改查询并使用dbpprop:name,我们会得到 17。尽管其中一些是重复的,所以您可能需要做其他事情来删除重复项。不过,关键是dbpprop:name得到了一些结果,rdfs:label但没有。

select * where {
   ?place a dbpedia-owl:Place ;
          dbpprop:name "Springfield"@en .
}

SPARQL 结果

您甚至可以dbpprop:name在处理人名时使用,尽管它没有那么有用,因为dbpprop:name大多数人的价值是他们的全名。要查找具有给定名称 John 的人,dbpprop:name需要使用如下查询:

select * where {
   ?place a dbpedia-owl:Person ;
          dbpprop:name ?name .
   FILTER( STRSTARTS( str( ?name ), "John" ) )
}

(或者您可以使用 CONTAINS 而不是 STRSTARTS),但这变得更加昂贵,因为它必须选择所有人员及其姓名,然后过滤该集合。能够根据特定名称(例如,with foaf:givenName)选择人员效率更高。

于 2013-05-29T12:34:00.357 回答