跳至内容

SPARQL/联合查询

来自 Wikibooks,开放世界的开放书籍

联合查询

[编辑 | 编辑源代码]

联合查询是指能够获取来自多个不同来源的信息并提供解决方案的能力。

其基本构建块是在查询执行期间,一个查询能够向另一个 SPARQL 端点发出查询。

联合查询比较 Wikidata 和英国议会数据库,以显示英国议会选区位置超过 10 公里的差异(来源 Wikidata:Wikidata:状态更新/2019 06 10

# compare lat/long of Parliament and Wikidata constituency records
#defaultView:Map{"hide":["?line"]}
PREFIX parliament:<https://id.parliament.uk/schema/>

SELECT DISTINCT ?constituency ?parlcoord ?item ?itemLabel ?wdcoord ?dist ?line WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  SERVICE <https://api.parliament.uk/sparql> 
    { ?constituency parliament:constituencyGroupHasConstituencyArea ?area .
      ?area parliament:latitude ?lat . ?area parliament:longitude ?long . 
      bind(SUBSTR(str(?constituency),26) as ?parlid) . }
  BIND(concat("Point(",str(?long)," ",str(?lat),")") as ?parlcoord) 
  # get constituencies from Parliament with coordinates
  ?item wdt:P6213 ?parlid . ?item wdt:P31 wd:Q27971968 . ?item wdt:P625 ?wdcoord . 
  # now get them from Wikidata with coordinates
  BIND(geof:distance(?parlcoord, ?wdcoord) as ?dist) . filter (?dist >= 10)
  # now find out the distance (in kms)
  ?item p:P625 ?statementnode. ?statementnode psv:P625 ?valuenode.
  ?valuenode wikibase:geoLatitude ?wikilat . ?valuenode wikibase:geoLongitude ?wikilon.
  BIND(CONCAT('LINESTRING (', STR(?wikilon), ' ', STR(?wikilat), ',', STR(?long), ' ', STR(?lat), ')') AS ?str) .
  BIND(STRDT(?str, geo:wktLiteral) AS ?line) 
}

试试看!

SPARQL 联合查询端点

[编辑 | 编辑源代码]

并非所有端点都允许 Wikidata 查询服务使用。请参阅 SPARQL 联合查询端点 上的允许端点列表。

您可以在 Wikidata:SPARQL 联合查询输入 中提名更多端点。

参考文献

[编辑 | 编辑源代码]


华夏公益教科书