sparql - 如何查询使用 Wikidata 和 SPARQL 的人?

标签 sparql wikidata

我是 SPARQL 和 Wikidata 的新手。我试图让我的用户在维基数据中搜索 人,并且只搜索 我不希望任何结果是摩托车品牌或任何东西。

所以我在 here 上玩了以下查询:

SELECT ?person ?personLabel WHERE {
  ?person wdt:P31 wd:Q5.
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "en".
    ?person rdfs:label ?personLabel .
  }
  FILTER regex(?personLabel, "Albert", "i").
}
LIMIT 10

尽管这最终会返回结果,但它几乎没有我希望的那么快。请注意,如果您尝试使用更大的名称进行上述查询,它也会超时。

所有示例查询都适用,发现 here ,假设您已经有一个可以从中查询的实体。在我的情况下,您无事可做,因为我正在尝试查询具有特定名称的人。
我可能对我正在使用的数据库的内部工作做出了一些错误的假设,但我不确定它们是什么。

有任何想法吗?

最佳答案

使用 Wikidata 进行自由文本搜索的问题在于它 does not have a free text index (yet) 。没有索引的文本搜索需要为每个标签尝试匹配,这是效率不高的。我想不出一个搜索“阿尔伯特·爱因斯坦”并且没有超时的查询。当然,完全匹配 ( ?person rdfs:label "Albert Einstein"@en . ) 确实有效,但大概这不符合您的需求。如果您可以先以其他方式缩小人员选择范围,那将会有所帮助。

另一方面,DBpedia ( http://dbpedia.org/sparql ) 有 Virtuoso 的 bif:contains 可用,所以它在那里工作得非常快 ( http://yasgui.org/short/HJeZ4kjp ):

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT * WHERE {
  ?sub a foaf:Person .
  ?sub rdfs:label ?lbl .
  ?lbl bif:contains "Albert AND Einstein" .
  filter(langMatches(lang(?lbl), "en"))
} 
LIMIT 10

关于sparql - 如何查询使用 Wikidata 和 SPARQL 的人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773812/

相关文章:

sparql - 如何获取近似术语的维基数据标签?

mediawiki-api - 获取作为给定项目实例的所有Wikidata项目

wikidata - Openrefine 和 wikidata : how to get values (not reconciliation)

youtube - 如何使用 youtube 视频中的 freebase id 查询 wikidata?

sparql - 在维基数据中按类型过滤

sparql - 尽管项目具有这些数据,但维基数据查询服务结果中缺少数据字段

sparql - 获取没有语言标签的字符串

wikipedia-api - 如何获取给定维基数据 ID 的语句列表?

rdf - 如何使用 sparql 查询访问 dbpedia 中的特定页面?

SPARQL 匿名变量名称,用于我不关心其值的变量