Отфильтровать небоскребы выше 500 метров в Викиданных

Пытаюсь построить SPARQL-запрос, в котором получаю список небоскребов высотой более 500 метров.

Я понял, что высота свойства (P2048) измеряется в разных единицах (метр, фут, сантиметр). Для меня не было бы проблемой пересчитать различные единицы измерения в метры.

Но моя проблема состоит в том, чтобы выяснить, что эта единица используется для высоты свойства.

Итак, мой вопрос: как я могу получить единицу измерения высоты объекта?

Мой запрос до сих пор, где ?unit просто пуст:

SELECT ?skyscraper ?skyscraperLabel ?height ?unit WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  ?skyscraper wdt:P31 wd:Q11303.
  ?skyscraper wdt:P2048 ?height.
  FILTER(?height > 500)
  OPTIONAL { ?skyscraper wdt:P2876 ?unit. }
}
LIMIT 100

Попробуйте здесь


person mcfly soft    schedule 25.05.2018    source источник
comment
Используйте ?skyscraper p:P2048/psn:P2048/wikibase:quantityAmount ?height., чтобы получить нормализованную высоту в метрах.   -  person UninformedUser    schedule 25.05.2018
comment
Большое спасибо. Это работает, но я не понимаю :-) Вы случайно не знаете какой-нибудь ссылки, где я мог бы узнать/понять, как работает это свойство?   -  person mcfly soft    schedule 25.05.2018
comment
@mcflysoft, см. mediawiki.org/wiki/Wikibase/Indexing/ (но, к сожалению, wdtn: работает только для нормализованных внешних идентификаторов).   -  person Stanislav Kralin    schedule 25.05.2018


Ответы (1)


Чтобы получить сам юнит, используйте :P2048/psv:P2048/wikibase:quantityUnit:

SELECT ?skyscraper ?skyscraperLabel ?height ?unit ?unitLabel WHERE {
  ?skyscraper wdt:P31 wd:Q11303.
  ?skyscraper p:P2048/psv:P2048 ?vn.
  ?vn wikibase:quantityAmount ?height.
  ?vn wikibase:quantityUnit ?unit.  
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
LIMIT 100

Попробуйте здесь

Однако, следуя приведенным выше комментариям AKSW и Станислава Кралина, лучше использовать нормализованные значения с префиксом psn:: p:P2048/psn:P2048/wikibase:quantityAmount:

SELECT ?skyscraper ?skyscraperLabel ?height WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  ?skyscraper wdt:P31 wd:Q11303.
  ?skyscraper p:P2048/psn:P2048/wikibase:quantityAmount ?height.
  FILTER(?height >= 500)
}
ORDER BY DESC(?height)
LIMIT 1000

Попробуйте здесь

Поскольку некоторые здания содержат несколько значений высоты (например, One ​​World Trade Center имеют оба архитектурная высота (Q24192182) и от высоты до вершины (Q26970842)), требуется некоторая агрегация для получения одного значения для каждого здания в SPARQL:

SELECT ?skyscraper ?skyscraperLabel (MAX(?h) AS ?height) WHERE {
  ?skyscraper wdt:P31 wd:Q11303.
  ?skyscraper p:P2048/psn:P2048/wikibase:quantityAmount ?h.
  FILTER(?h >= 500)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
GROUP BY ?skyscraper ?skyscraperLabel
ORDER BY DESC(?height)
LIMIT 1000

Попробуйте здесь

person Udi    schedule 27.05.2018