Sparql 查询某个类的子代、孙子等

2023-12-06

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


这可能会被回答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     |
--------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sparql 查询某个类的子代、孙子等 的相关文章

随机推荐