8

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

所以我在这里玩了以下查询:

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

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

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

有任何想法吗?

4

3 回答 3

9

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

另一方面,DBpedia ( http://dbpedia.org/sparqlbif:contains ) 有 Virtuoso可用,所以这在那里工作得非常快 ( 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
于 2016-09-29T19:26:47.583 回答
7

您可以尝试使用标签代替过滤器:

SELECT ?item ?itemLabel WHERE {
  ?item wdt:P31 wd:Q5.
  ?item ?label "Einstein"@en .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

在Wikidata 查询服务上查看

但我不确定您是否可以使用通配符进行搜索。

于 2016-09-29T19:42:56.357 回答
2

以下查询可能是您正在寻找的

SELECT DISTINCT ?item ?itemLabel ?dateOfBirth 
WHERE {
  hint:Query hint:optimizer "None".
  SERVICE wikibase:mwapi {
    bd:serviceParam wikibase:api "Search";
                    wikibase:endpoint "www.wikidata.org";
                    mwapi:srsearch "Franz Kafka haswbstatement:P31=Q5".
    ?item wikibase:apiOutputItem mwapi:title .
  }
  OPTIONAL {?item wdt:P569 ?dateOfBirth . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

而另见https://www.wikidata.org/wiki/Wikidata:Request_a_query#How_to_query_for_people_by_first_and%2For_last_name%3F

于 2021-09-04T22:48:47.187 回答