Sparql 如何使用DBpedia知道字符串是人名还是地名?

Sparql 如何使用DBpedia知道字符串是人名还是地名?,sparql,semantic-web,dbpedia,Sparql,Semantic Web,Dbpedia,我在一个Prolog项目中使用DBpedia上的SPARQL查询,对此我有疑问。我很可能知道一个词是不是一个人的名字,比如:约翰、马里奥,还是一个城市的名字:罗马、伦敦、纽约 我已经实现了以下两个查询,第一个查询给出了具有特定姓名的人数,第二个查询给出了具有特定姓名的地点的数量 1查询人名: 对于名称John,我获得以下输出:callret-0:7313,因此我认为它找到了7313个正确名称John的实例。是这样吗 2查询地名: 问题是,正如您在前面的“place”查询中所看到的,我插入了Joh

我在一个Prolog项目中使用DBpedia上的SPARQL查询,对此我有疑问。我很可能知道一个词是不是一个人的名字,比如:约翰、马里奥,还是一个城市的名字:罗马、伦敦、纽约

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

1查询人名:

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

2查询地名:

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

问题是,通过这种方式,如果我比较前两个查询的输出,似乎John是一个地名而不是人名!这不适合我的范围;我尝试过使用其他人名,但经常发生的情况是,place查询给我的输出比name查询更大


为什么??我错过了什么?我的查询中有错误吗?如何解决该问题以获得正确的结果?

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

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:

如果您实际要求使用带有rdfs:标签的dbpedia owl:PlacesJohn@en,则不会得到任何结果:

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

也可以考虑使用dppPRP:名称而不是rdfs:Label.有些结果似乎更有用。例如,让我们找一个叫斯普林菲尔德的地方。如果我们要求提供具有该名称的地点,则不会得到任何结果:

select COUNT(?place) as ?numPlaces where {
   ?place a dbpedia-owl:Place ;
          rdfs:label "John"@en .
}
select * where {
   ?place a dbpedia-owl:Place ;
          rdfs:label "Springfield"@en .
}
但是,如果我们修改查询并使用dbpprop:name,则得到17。但是,其中一些是重复的,因此您可能需要执行其他操作来删除重复项。但关键是dbpprop:name得到了一些结果,而rdfs:label没有

select * where {
   ?place a dbpedia-owl:Place ;
          dbpprop:name "Springfield"@en .
}
您甚至可以在处理人名时使用dbpprop:name,尽管它没有那么有用,因为大多数人的dbpprop:name值是他们的全名。要使用dbpprop:name查找名为John的人员,需要进行如下查询:

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

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

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

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:

如果您实际要求使用带有rdfs:标签的dbpedia owl:PlacesJohn@en,则不会得到任何结果:

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

也可以考虑使用dppPRP:名称而不是rdfs:Label.有些结果似乎更有用。例如,让我们找一个叫斯普林菲尔德的地方。如果我们要求提供具有该名称的地点,则不会得到任何结果:

select COUNT(?place) as ?numPlaces where {
   ?place a dbpedia-owl:Place ;
          rdfs:label "John"@en .
}
select * where {
   ?place a dbpedia-owl:Place ;
          rdfs:label "Springfield"@en .
}
但是,如果我们修改查询并使用dbpprop:name,则得到17。但是,其中一些是重复的,因此您可能需要执行其他操作来删除重复项。但关键是dbpprop:name得到了一些结果,而rdfs:label没有

select * where {
   ?place a dbpedia-owl:Place ;
          dbpprop:name "Springfield"@en .
}
您甚至可以在处理人名时使用dbpprop:name,尽管它没有那么有用,因为大多数人的dbpprop:name值是他们的全名。要使用dbpprop:name查找名为John的人员,需要进行如下查询:

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

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

Tnx为了您的清楚解释,现在我将更好地记录SPARQL。我已经理解了我的错误,但是我对计算一个地方的实例数的查询有一些问题,这一个:选择count?place as?numPlaces,其中{?place a dbpedia owl:place;rdfs:labelRoma@en . }您可以看到,如果我将Roma作为参数,则输出为:numPlaces=0如果我更改它并使用Rome,则输出为numPlaces=1。为什么会出现这种行为?@AndreaNobili the@en是文字的语言标记。Th
英语名字是罗马,不是罗马。如果使用查询,请选择*WHERE{?放置dbpedia owl:place;rdfs:labelRoma@it},您将在中看到一行。@AndreaNobili如中所述,您可以在忽略字符串的语言标记的情况下搜索字符串,但这需要筛选器和字符串比较,而且速度要慢得多。如果您正在用意大利语搜索字符串,最好使用@it@en.Tnx进行清晰的解释,现在我将更好地记录SPARQL。我已经理解了我的错误,但是我对计算一个地方的实例数的查询有一些问题,这一个:选择count?place as?numPlaces,其中{?place a dbpedia owl:place;rdfs:labelRoma@en . }您可以看到,如果我将Roma作为参数,则输出为:numPlaces=0如果我更改它并使用Rome,则输出为numPlaces=1。为什么会出现这种行为?@AndreaNobili the@en是文字的语言标记。英文名字是罗马,不是罗马。如果使用查询,请选择*WHERE{?放置dbpedia owl:place;rdfs:labelRoma@it},您将在中看到一行。@AndreaNobili如中所述,您可以在忽略字符串的语言标记的情况下搜索字符串,但这需要筛选器和字符串比较,而且速度要慢得多。如果您正在用意大利语搜索字符串,最好使用@it@en。