[英]How can I optimize my recursive SPARQL query?
我正在尝试使用递归 SPARQL 查询从 Wikidata 中提取建筑物,但我不断收到查询超时。 有没有办法绕过这个?
这是我当前的查询,选择具有 Freebase ID 或 Google 知识图 ID 以及荷兰语标签的所有建筑物:
SELECT DISTINCT ?building ?buildingLabel
WHERE {
?building p:P2671|p:P646 ?id;
p:P31/ps:P31/wdt:P279* wd:Q41176;
rdfs:label ?buildingLabel .
FILTER(LANG(?buildingLabel) = 'nl') .
FILTER (?building != ?buildingLabel) .
}
我试过手动查看几层深,但由于某种原因,我没有得到三层或更深的结果,即使这些确实存在。 我已经尝试过使用:
SELECT ?building
WHERE {
?building p:P31/ps:P31/wdt:P279 [p:P31/ps:P31/wdt:P279 [p:P31/ps:P31/wdt:P279 wd:Q41176]].
}
并使用
SELECT ?building
WHERE {
?parent2 p:P31/ps:P31/wdt:P279 wd:Q41176.
?parent1 p:P31/ps:P31/wdt:P279 ?parent2.
?building p:P31/ps:P31/wdt:P279 ?parent1.
}
维基数据上大约有 224 万座建筑物和大约 1800 万个实体具有 Freebase ID 或 Google 知识图谱 ID。 我看过本指南,但无法弄清楚如何将其应用于我的查询。 我也阅读了这个问题的答案,但不幸的是,使用多个查询对我来说并不是一个真正的选择。
如果你的目的是使用“递归”属性的路径来寻找建筑类型的东西,而且也类型的建筑物的子类,使用您的第一个查询wdt:P279*
是正确的,而在重复满后尝试p:P31/ps:P31/wdt:P279
模式不会匹配任何数据。
通过稍微简化第一个查询,我能够运行它(在 39 秒内返回 96,297 个结果):
SELECT DISTINCT ?building ?buildingLabel
WHERE {
?building p:P2671|p:P646 ?id;
wdt:P31/wdt:P279* wd:Q41176 .
?building rdfs:label ?buildingLabel .
FILTER(LANGMATCHES(LANG(?buildingLabel), "nl"))
}
两个显着的变化:
p:P31/ps:P31
替换为wdt:P31
,从查询中删除一个连接。FILTER
是不必要的,因为?building
(a URI) 和?buildingLabel
(a string) 必然是不相等的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.