我在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是一个地方,而不是一个人名!这对我的范围不利;我尝试过使用其他个人名称,并且总是会发生地点查询给出比名称查询更大的输出。
为什么呢?我错过了什么?我的查询中是否存在错误?如何解决它才能得到正确的结果?
答案 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"
此外,您可以考虑使用select COUNT(?place) as ?numPlaces where {
?place a dbpedia-owl:Place ;
rdfs:label "John"@en .
}
代替dbpprop:name
。有些结果似乎更有用。例如,让我们找到名为rdfs:label
的地方。如果我们要求有这个名字的地方,我们就没有结果:
"Springfield"
但是,如果我们修改查询并使用select * where {
?place a dbpedia-owl:Place ;
rdfs:label "Springfield"@en .
}
,我们会得到17.其中一些是重复的,因此您可能需要做其他事情来删除重复项。但问题是,dbpprop:name
得到了一些结果,dbpprop:name
没有得到。
rdfs:label
你甚至可以使用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" ) )
}
)会更有效率。