7

我目前正在寻找一种通过 SPARQL 端点查询DBPedia 的 Infobox Onyology 数据库的方法,以获取类列表、所选类的子类以及给定类的属性。据我所知,您要么需要知道您正在寻找的属性,要么搜索特定的东西——我发现的所有示例似乎都基于您想要搜索特定的东西的想法(例如高于一定海拔的城市人口等),而我想构建一些可以有效“浏览”类别的东西。例如,从这个类层次图上“owl:Thing”的子类列表开始并向用户呈现所选子类的子类列表。似乎可以通过映射 wiki 浏览类似的内容,但最好直接查询 SPARQL 端点。

是否有一些简单的 SPARQL 查询可以返回这些类的可用类和属性?

更新: 我想出了一种方法来获取它看起来的类层次结构,通过迭代这个查询:

SELECT ?subject WHERE {
     ?subject rdfs:subClassOf owl:Thing
}

它返回 owl:Thing 的子类列表,如果我用其中一个子类替换 owl:Thing,我会得到该子类的子类列表,直到没有子类,此时我可以选择所有具有由所选子类给出的类型。不过,我仍然不太确定如何获取子类共有的所有属性。

更新 2 现在越来越近了。这个查询让我得到所有的属性(dbpedia:property 的子级)也是一个国家,以及它们的标题:

SELECT DISTINCT ?prop ?title WHERE {
     ?country ?prop ?value.
     ?country a <http://dbpedia.org/ontology/Country>.
     ?prop rdf:type rdf:Property.
     ?prop rdfs:label ?title
}

这实际上是我真正要求的。我现在要做的最后一件事是尝试按它们出现的页数对它们进行排序(大概最常见的属性将是最感兴趣的属性)。

4

4 回答 4

7

好的,所以我实际上或多或少地弄清楚了如何做到这一点,所以我将其作为答案提交,而不仅仅是编辑。似乎给了我我正在寻找的东西是首先使用此查询遍历类层次结构:

SELECT ?class ?label WHERE {
     ?class rdfs:subClassOf owl:Thing.
     ?class rdfs:label ?label. 
     FILTER(lang(?label) = "en")
}

每次都将选定的结果输入到查询中,而不是 owl:Thing。

一旦用户选择了他们想要的最低级别的类,以按出现的条目数降序显示属性列表,我使用此查询

SELECT ?prop ?title WHERE {
     ?country ?prop [].
     ?country a <http://dbpedia.org/ontology/Country>.
     ?prop rdf:type rdf:Property.
     ?prop rdfs:label ?title
} ORDER BY DESC(COUNT(DISTINCT ?country))

当然,如果你真的看这些结果,那里有一些时髦的属性,没有非常描述性的标签(“s”?什么?),但这至少是我首先要寻找的。

于 2011-03-20T02:22:08.357 回答
3

(1) 查询所有现有类:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?class
WHERE {
  ?s rdf:type ?class .
}

(2) 查询 C 类的任何实例中使用的所有属性:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?property
WHERE {
  ?s rdf:type <C> .
  ?s ?property ?o
}
于 2011-03-20T01:11:38.113 回答
2

rdfs:domain这将为您提供所有为s的属性SpaceMission

select ?property where {
    ?property rdfs:domain <http://dbpedia.org/ontology/SpaceMission>
}

这些属性都接受SpaceMission作为主题。

请注意,在 RDF(S) 中,不需要rdfs:domain对每个属性都有明确的声明,因为rdfs:domains 可以通过属性的使用来暗示。因此,您可能会发现此查询将为您提供已使用域定义SpaceMission的所有属性的列表,但不会为您提供实际与 的所有实例一起使用的所有属性的列表SpaceMission

于 2011-03-20T00:45:40.933 回答
1

很可能某些属性实际上没有这样定义:

?pardf:属性。

但是任何位于中间位置的术语根据定义都是一个属性。因此,您可能会通过以下方式获得更多结果:

选择 ?prop ?title WHERE {
     ?国家一个<http://dbpedia.org/ontology/Country>。
     ?国家?prop []。
     ?prop rdfs:label ?title 。
}
ORDER BY DESC(COUNT(DISTINCT ?country))

(稍微重新排序,一开始有选择性可能会提高性能)

于 2011-03-29T17:33:29.137 回答