这可能会被回答Sparql 查询子类或等效项,但是这个问题及其答案包含了比您在这里要求的更多的信息。您无法真正强制执行搜索策略(深度优先与广度优先),但如果从根到子类存在唯一路径,您可以(在某种程度上)根据距根的距离对子类进行排序。首先,让我们获取一些示例数据:
@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+
,或者你可以过滤掉:a
with filter( ?subclass != :a )
.
如果从根到子类只有一条路径,您可以计算它们之间的中间节点以确定它们的深度。如果您以这种方式按深度排序,那么您将得到类似于广度优先搜索的结果,如下所示。该技术更详细地描述于是否可以在 SPARQL 中获取 RDF 集合中元素的位置? and 计算节点之间的路径长度?.
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 |
--------------------