如何查询使用维基数据和 SPARQL 的人员?
How to query for people using Wikidata and SPARQL?
我是 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
虽然这最终 returns 结果并不像我希望的那样快。请注意,如果您使用更大的名称尝试上述查询,它也会超时。
所有示例查询均适用,发现 here,假设您已经有一个可以从中查询的实体。虽然在我的情况下你没有什么可继续的,因为我正在尝试查询具有特定名称的人。
我可能对我正在使用的数据库的内部工作方式做出了一些错误的假设,但我不确定它们是什么。
有什么想法吗?
使用维基数据进行自由文本搜索的问题在于 does not have a free text index (yet)。如果没有索引,文本搜索需要为每个标签尝试匹配,这是低效的。我想不出一个搜索 "Albert Einstein" 并且不会超时的查询。当然,完全匹配 (?person rdfs:label "Albert Einstein"@en .
) 确实有效,但可能不符合您的需要。如果您能先通过其他方式缩小人员选择范围,将会有所帮助。
DBpedia (http://dbpedia.org/sparql), on the other hand, has Virtuoso's bif:contains
available, so this works quite fast there (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
您可以尝试使用标签代替过滤器:
SELECT ?item ?itemLabel WHERE {
?item wdt:P31 wd:Q5.
?item ?label "Einstein"@en .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
上查看
但我不确定您是否可以使用通配符进行搜索。
以下查询可能是您要查找的内容
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". }
}
我是 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
虽然这最终 returns 结果并不像我希望的那样快。请注意,如果您使用更大的名称尝试上述查询,它也会超时。
所有示例查询均适用,发现 here,假设您已经有一个可以从中查询的实体。虽然在我的情况下你没有什么可继续的,因为我正在尝试查询具有特定名称的人。 我可能对我正在使用的数据库的内部工作方式做出了一些错误的假设,但我不确定它们是什么。
有什么想法吗?
使用维基数据进行自由文本搜索的问题在于 does not have a free text index (yet)。如果没有索引,文本搜索需要为每个标签尝试匹配,这是低效的。我想不出一个搜索 "Albert Einstein" 并且不会超时的查询。当然,完全匹配 (?person rdfs:label "Albert Einstein"@en .
) 确实有效,但可能不符合您的需要。如果您能先通过其他方式缩小人员选择范围,将会有所帮助。
DBpedia (http://dbpedia.org/sparql), on the other hand, has Virtuoso's bif:contains
available, so this works quite fast there (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
您可以尝试使用标签代替过滤器:
SELECT ?item ?itemLabel WHERE {
?item wdt:P31 wd:Q5.
?item ?label "Einstein"@en .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
上查看
但我不确定您是否可以使用通配符进行搜索。
以下查询可能是您要查找的内容
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". }
}