2011-03-19 89 views
7

我目前正在寻找一种方法来通过SPARQL端点查询DBPedia's Infobox Onyology database以获取类的列表,所选类的子类和给定类的属性。就我所能找到的,你要么需要知道你正在寻找的财产,要么搜索特定的东西 - 我发现的所有例子似乎都是基于这样的想法,即你想要搜索某些特定的东西(比如特定高程以上的城市人口等),而我想建立一些可以有效“浏览”类别的东西。例如,从this class hierarchy chart上的“owl:Thing”的子类列表开始,并向用户显示所选子类的子类列表。似乎可以通过映射wiki来浏览像这样的内容,但最好是直接查询SPARQL端点。获取DBPedia信息框类别

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

更新: 我想出了一个办法,通过this query:

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

它返回猫头鹰的子类列表以获得类层次看来,通过迭代:事情,如果我用其中一个子类替换owl:Thing,我得到这个子类的列表,直到没有子类为止,此时我可以选择所有具有由所选子类给出的类型的资源。不过,我仍然不确定如何获得子类的所有属性。

更新2 现在开始接近。该查询得到我的所有属性(DBpedia中的孩子:属性),同时也是一个国家,以及它们的标题:

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

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

回答

7

好了,其实我已经想通或多或少的确切如何做到这一点,所以我提交这个答案,而不仅仅是一个编辑。什么似乎给我正是我要找的是层次结构使用this query通过类迭代开始:

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

选择的结果送入查询到位猫头鹰的:每一次的事情。

一旦用户已经选择了他们希望,以显示属性的列表,在由它们出现的条目的数量从大到小的顺序最低级别的类中,我使用this query

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”?什么?),但这至少是我一直在寻找的东西。

2

这将让你所有那些rdfs:domain属性是SpaceMission S:

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

这些特性都接受SpaceMission为主题。

请注意,在RDF(S)中,不需要为每个属性明确指定rdfs:domain语句,因为rdfs:domain可以通过属性的使用暗示。你可能因此发现,这种查询会给你已所有属性的列表与SpaceMission域定义但不会放弃你,是实际上所有的SpaceMission实例的使用所有属性的列表。

+0

无论出于何种原因,似乎没有当你选择国家而不是SpaceMission工作。它返回的是“twinCountry”。此外,它似乎只返回dbpedia中的东西:本体,而不是dbpedia:属性。我更新了主帖,看起来是对我原来的问题的回答。 – Paul 2011-03-20 01:06:15

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 
} 
1

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

?p a rdf:Property .

但在中间位置的任何条款被定义的属性。所以,你可能会得到更多的结果有:

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

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