这可以通过Sparql查询Subclass或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 .
Run Code Online (Sandbox Code Playgroud)
您可以使用这样的查询来获取以下子类: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
}
Run Code Online (Sandbox Code Playgroud)
------------
| subclass |
============
| :a |
| :c |
| :g |
| :f |
| :b |
| :e |
| :d |
------------
Run Code Online (Sandbox Code Playgroud)
结果包括:a因为我们使用了路径rdfs:subClassOf*.这在逻辑上是正确的,因为一类是自身的一个子类,但如果你不想:a包括在内,你可以使用rdfs:subClassOf+,或者你可以过滤掉:a有filter( ?subclass != :a ).
如果从根到子类有一条路径,您可以计算它们之间的中间节点以确定它们的深度.如果您以这种方式按深度排序,那么您将得到的结果类似于广度优先搜索会给您提供以下内容.更详细地描述了这种技术是否可以在SPARQL中获取RDF集合中元素的位置?并计算节点之间的路径长度?.
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
Run Code Online (Sandbox Code Playgroud)
--------------------
| subclass | depth |
====================
| :a | 0 |
| :b | 1 |
| :c | 1 |
| :d | 2 |
| :e | 2 |
| :f | 2 |
| :g | 2 |
--------------------
Run Code Online (Sandbox Code Playgroud)