使用SPARQL

时间:2017-02-06 19:57:10

标签: properties nested sparql wikidata

我需要使用维基数据中的SPARQL查询服务。

我需要检索的是所有属性的列表,这些属性是(P31)疾病(Q12136)的实例

我在理解如何嵌套两个查询方面遇到了一些麻烦

使用此查询,我们拥有所有疾病实例:

SELECT?item WHERE {   ?item wdt:P31 wd:Q12136。 }

然后这是属性列表,但不是在整个站点中搜索,而是我必须在上一句中获得的子组中搜索

SELECT DISTINCT?property?propertyLabel 哪里 {     ?属性wikibase:属性。     SERVICE wikibase:label {bd:serviceParam wikibase:language" en" } } ORDER BY?propertyLabel

嵌套两个查询的正确方法是什么?此外,您也可以检索属性的类型吗?

感谢。

1 个答案:

答案 0 :(得分:2)

这两个查询的合并可能类似于:

SELECT DISTINCT ?property ?propertyLabel WHERE {
  ?item wdt:P31 wd:Q12136 .
  ?item ?property ?value .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

[try it]

请注意DISTINCT关键字,用于重复删除属性。

但要获取正确的属性标签(而不是像http://www.wikidata.org/prop/P279这样的属性URI),您需要使用a slightly more complex query

SELECT DISTINCT ?property ?propLabel WHERE {
  ?item wdt:P31 wd:Q12136 .
  ?item ?property ?value .
  hint:Query hint:optimizer "None" .
  ?prop wikibase:directClaim ?property .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

[try it]

然后,要获取属性数据类型,可以使用wikibase:propertyType

SELECT DISTINCT ?property ?propLabel ?type WHERE {
  ?item wdt:P31 wd:Q12136 .
  ?item ?property ?value .
  # get the property label
  # see https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries#Adding_labels_for_properties
  hint:Query hint:optimizer "None" .
  ?prop wikibase:directClaim ?property .
  ?prop wikibase:propertyType ?type .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

[try it]