我尝试构建一个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
答案 0 :(得分: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和Stanislav Kralin的上述评论,最好使用psn:
前缀p:P2048/psn:P2048/wikibase:quantityAmount
使用Normalized values:
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同时具有architectural height (Q24192182)和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