【发布时间】:2018-04-16 16:39:11
【问题描述】:
是否有一种 RDF 数据/其他格式允许我获取一个类别中可能存在的所有属性,例如人,那么我应该返回诸如性别,出生日期之类的属性。
如何在https://query.wikidata.org/查询此信息?
我想要的是这个https://www.wikidata.org/wiki/Wikidata:List_of_properties/Summary_table 但是有没有更好的格式呢?我想以编程方式访问。
更新
这个查询太重了,导致超时。
SELECT ?p ?attName WHERE {
?q wdt:P31 wd:Q5.
?q ?p ?statement.
?realAtt wikibase:claim ?p.
?realAtt rdfs:label ?attName.
FILTER(((LANG(?attName)) = "en") || ((LANG(?attName)) = ""))
}
GROUP BY ?p ?attName
我必须指定实体,例如对 Barrack Obama 来说它可以工作,但这并没有给我所有可能的属性。
SELECT ?p ?attName WHERE {
BIND(wd:Q76 AS ?q)
?q wdt:P31 wd:Q5.
?q ?p ?statement.
?realAtt wikibase:claim ?p.
?realAtt rdfs:label ?attName.
FILTER(((LANG(?attName)) = "en") || ((LANG(?attName)) = ""))
}
GROUP BY ?p ?attName
【问题讨论】:
-
为什么不能使用像
SELECT DISTINCT ?p {?s rdf:type/rdfs:subClassOf* <THE_PERSON_URI> ; ?p ?o }这样的 SPARQL 查询? -
@AKSW 嗨,我将其解释为
SELECT DISTINCT ?p {?s wdt:P31 wd:Q5 ; ?p ?o }任何人类实例的实际示例,但该查询非常耗费资源,导致“达到查询超时限制”,因为它正在获取人类的所有实例。 -
我知道这个查询很昂贵。另一种虽然不完整的方法是 a) 将其简化为一些较小的子类(如果可能的话)或 b) 检查域为 person(或其子类之一)的属性
-
a) 不可能,因为人类是足够的子类。 b)它可能适用于人员类别,但不适用于其他类别,如行星,它具有来自许多不同属性类别的数据。所以丢失了很多信息。我认为我的临时解决方案是指定一个特定实例(我更新问题的最后一个查询)
-
好吧,您至少可以将其限制为
n在子查询中获得的实例数。不过,这至少可以返回更多属性,但仍然不能保证完整性