Фильтр небоскребов выше 500 метров в Викидате - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь построить запрос 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

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

1 Ответ

0 голосов
/ 27 мая 2018

Чтобы получить единицу, используйте :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

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

Поскольку в некоторых зданиях имеется несколькозначения высоты (например, Один всемирный торговый центр имеют как архитектурная высота (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

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

...