获取一个条目的所有标签和值的Wikidata属性

11
我的问题是如何从Wikidata上通过SPARQL提取所有属性及其对应的标签,这些标签也在网页上呈现。
以Wikidata上的Google条目为例。对于属性P414(证券交易所)或P159,有子属性如P969(位于街道地址)。当您使用querywbgetentities作为限定符时,它们实际上会出现。 wbgetentities的问题是标签缺失。我可以通过以下SPARQL查询获得所需输出(例如wdt:P17 => country => United States of America):
SELECT ?prop_id ?prop_label ?prop_val_label WHERE {
  VALUES (?company) {
    (wd:Q95)
  }
  ?company ?prop_id ?company_item.
  ?wd wikibase:directClaim ?prop_id.
  ?wd rdfs:label ?prop_label.
  OPTIONAL {
    ?company_item rdfs:label ?prop_val.
    FILTER((LANG(?prop_val)) = "en")
  }
  BIND(COALESCE(?prop_val, ?companyItem) AS ?prop_val_label)
  FILTER((LANG(?prop_label)) = "en")
}

但是这些“子属性”丢失了,因为它们不在直接声明之下。要提取单个语句的限定符,我可以执行以下操作:

SELECT ?company ?hq ?country WHERE {
  wd:Q95 p:P159 ?company.
  OPTIONAL {
    ?company ps:P159 ?hq.
    ?company pq:P17 ?country. 
  }
}

但问题是是否有一种方法将所有内容合并为一个查询?

1个回答

21

Wikidata数据模型相关的有用链接:

您的查询应该是这样的:

SELECT ?wdLabel ?ps_Label ?wdpqLabel ?pq_Label {
  VALUES (?company) {(wd:Q95)}

  ?company ?p ?statement .
  ?statement ?ps ?ps_ .

  ?wd wikibase:claim ?p.
  ?wd wikibase:statementProperty ?ps.

  OPTIONAL {
  ?statement ?pq ?pq_ .
  ?wdpq wikibase:qualifier ?pq .
  }

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} ORDER BY ?wd ?statement ?ps_

点击试用!

该结果仅包含限定符及其值。不包括来源参考和值注释(例如时间精度)。如果需要添加,请写下评论。


关于SPARQL片段的问题:是否可以为所有返回的数据添加实体节点对象ID。准确地说,对于你提到的Google的例子: wdLabel | 创始人 ps_Label | Larry Page 是否可以同时返回ps_Label和pq_Label的ID(如果它们是实体)? - fabmeyer
2
@fabmeyer,像这样:https://w.wiki/7N$B 这样? - Stanislav Kralin
天才!我在哪里可以好好学习这个呢? - fabmeyer
@fabmeyer,那是基本的SPARQL。标签服务是WDQS扩展。有关Wikibase RDF转储格式的更多信息,请参阅:https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format - Stanislav Kralin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接