繁体   English   中英

如何优化我的递归 SPARQL 查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM