在维基数据中过滤高于 500 米的摩天大楼
Filter skyscrapers higher than 500 meters in Wikidata
我尝试构建一个 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
要获取单位本身,请使用 :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 和 Stanislav Kralin 的上述评论,最好使用带有 psn:
前缀的 Normalized values: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 have both architectural height (Q24192182) and height to pinnacle (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
我尝试构建一个 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
要获取单位本身,请使用 :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 和 Stanislav Kralin 的上述评论,最好使用带有 psn:
前缀的 Normalized values: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 have both architectural height (Q24192182) and height to pinnacle (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