使用 SPARQL,如何通过标识符为节点 SELECT,特别是在维基数据中?

With SPARQL, how to SELECT for node by identifer, specifically in wikidata?

使用 Wikidata SPARQL service, I would like to get the list of the 50 states and include the District of Columbia from Wikidata. I have come up with a kludgy query to do so:

#-- wdt:P31 = instance of;  wd:Q35657 = list of states

SELECT ?state ?stateLabel
   WHERE {
     {?state wdt:P31 wd:Q35657} UNION 
     {?state wdt:P3403 wd:Q3551781} . #-- coextensive with District of Columbia
   SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

我的查询有效,但我将 DC 提取到结果中的方式很丑陋。 (维基数据中数据的未来更改可能会破坏此查询。)我想说的是

UNION {?state == wd:Q61}

直接包含 Washington, D.C. (Q61)。但是,作为 SPARQL 的新手,我无法理解这样做的 SPARQL 语法。如果能重写此查询以直接引入 wd:Q61,我将不胜感激。

如果您担心当前使用的 属性 不稳定,您可以使用外部标识符来唯一标识华盛顿 D.C。

例如,要使用华盛顿的 Geonames ID,D.C。在您的 UNION 语句中,您可以使用以下内容:

# wdt:P31 = instance of;  wd:Q35657 = list of states; wdt:P1566 = Geonames ID

SELECT ?state ?stateLabel
   WHERE {
     {?state wdt:P31 wd:Q35657} UNION 
     {?state wdt:P1566 "4138106"} . # we want wd:Q61
   SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

您可以使用 SPARQL 1.1 BIND 向结果集添加固定资源,即

SELECT ?state ?stateLabel WHERE {
     {?state wdt:P31 wd:Q35657} 
       UNION 
     {BIND(wd:Q61 as ?state)}
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}