Как с помощью SPARQL ВЫБРАТЬ узел по идентификатору, особенно в викиданных?

Используя службу Wikidata SPARQL, я хотел бы получить список из 50 штатов, включая округ Колумбия из Викиданных. Я придумал сложный запрос:

#-- 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}

чтобы напрямую включить Вашингтон, округ Колумбия (Q61). Однако, как новичок в SPARQL, я не могу понять синтаксис SPARQL для этого. Я был бы признателен за любую помощь в переписывании этого запроса для прямого извлечения wd:Q61.


person Raymond Yee    schedule 24.01.2017    source источник
comment
Вы можете использовать SPARQL 1.1 BIND, т.е. {?state wdt:P31 wd:Q35657} UNION {BIND(wd:Q61 as ?state)}, чтобы добавить фиксированные ресурсы в набор результатов.   -  person UninformedUser    schedule 24.01.2017


Ответы (2)


Вы можете использовать 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" }
}
person UninformedUser    schedule 24.01.2017
comment
Спасибо - я ищу именно такой ответ. I подтвердите, что это работает. - person Raymond Yee; 25.01.2017

Вы можете использовать внешний идентификатор для однозначной идентификации Вашингтона, округ Колумбия, если вас беспокоит нестабильность используемого в настоящее время свойства.

Например, чтобы использовать идентификатор Geonames для Вашингтона, округ Колумбия, в операторе 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" }
}
person Dan Scott    schedule 24.01.2017
comment
Использование вами идентификатора Geonames ID - хорошая идея и улучшение моего запроса, поскольку вероятность (невозможно?) Использования одного и того же идентификатора для нескольких объектов в Викиданных менее вероятна. Спасибо за размещение этого решения. Однако я все еще ищу способ напрямую сослаться на wd:Q61. Вы знаете, как это сделать? - person Raymond Yee; 24.01.2017