Sparql查询一个类的子,孙子,..

Nic*_*ick 3 owl sparql protege4 protege

我有一个我在Protege中构建的猫头鹰文件.什么是sparql查询,它将选择类的所有子类以及这些子类的所有子类,依此类推(广度优先搜索排序方式)?

Jos*_*lor 7

这可以通过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+,或者你可以过滤掉:afilter( ?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)