代码之家  ›  专栏  ›  技术社区  ›  mcfly soft

在Wikidata中过滤高度超过500米的摩天大楼

  •  1
  • mcfly soft  · 技术社区  · 6 年前

    我尝试构建一个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
    

    Try it here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Udi    6 年前

    要获取设备,请使用 :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
    

    Try it here

    然而,根据AKSW和Stanislav Kralin的上述评论,最好使用 Normalized values 使用 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
    

    Try this here

    由于某些建筑包含多个高度值(例如, 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
    

    Try it here