2014-04-15 64 views
2

我有一个我建立在Protege的猫头鹰文件。什么是sparql查询将选择一个类的所有子类和这些子类的所有子类,等等等等(广度优先搜索排序方式)?Sparql查询为儿童,孙辈,..一类

+0

我敢肯定这是一个重复。主要思想是你要使用属性路径:'select?subclass where {?subclass rdfs:subClassOf + }'。 –

回答

6

这可能由Sparql query Subclass or EquivalentTo回答,但该问题及其答案包含更多的信息,你在这里要求什么。您无法真正实施搜索策略(深度优先与深度优先),但是如果从根目录到子目录有独特的路径,则可以(按照)排序子类的距离。首先,让我们得到一些样本数据:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. 
@prefix : <https://stackoverflow.com/q/23094361/1281433/>. 

#   a 
#  / \ 
#   b  c 
#  /\ /\ 
#  d e f g 

:b rdfs:subClassOf :a . 
:c rdfs:subClassOf :a . 

:d rdfs:subClassOf :b . 
:e rdfs:subClassOf :b . 

:f rdfs:subClassOf :c . 
:g rdfs:subClassOf :c . 

您可以使用这样的查询得到的:a子类:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix : <https://stackoverflow.com/q/23094361/1281433/> 

select ?subclass where { 
    ?subclass rdfs:subClassOf* :a 
} 
------------ 
| subclass | 
============ 
| :a  | 
| :c  | 
| :g  | 
| :f  | 
| :b  | 
| :e  | 
| :d  | 
------------ 

结果包括:a,因为我们使用的路径rdfs:subClassOf*。这在逻辑上是正确的,因为一个类是它自己的一个子类,但是如果你不想要:a包括在内,你可以使用rdfs:subClassOf+,或者你可以用filter(?subclass != :a)来过滤掉:a

在从根到子类有一条路径的情况下,可以计算它们之间的中间节点来确定它们的深度。如果你以这种方式进行深度排序,那么你会得到你的结果,就像第一次搜索会给你以下的结果。该技术在Is it possible to get the position of an element in an RDF Collection in SPARQL?Calculate length of path between nodes?中有更详细的描述。

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix : <https://stackoverflow.com/q/23094361/1281433/> 

select ?subclass (count(?intermediate)-1 as ?depth) where { 
    ?subclass rdfs:subClassOf* ?intermediate . 
    ?intermediate rdfs:subClassOf* :a . 
} 
group by ?subclass 
order by ?depth 
-------------------- 
| subclass | depth | 
==================== 
| :a  | 0  | 
| :b  | 1  | 
| :c  | 1  | 
| :d  | 2  | 
| :e  | 2  | 
| :f  | 2  | 
| :g  | 2  | 
-------------------- 
+0

精彩的例子。谢谢! –