我有一个在 Protege 中构建的 owl 文件。什么是 sparql 查询,它将选择一个类的所有子类以及这些子类的所有子类,依此类推(广度优先搜索方式)?
问问题
5027 次
2 回答
10
这可能会由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 .
您可以使用这样的查询来获取的子类: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
掉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
--------------------
| subclass | depth |
====================
| :a | 0 |
| :b | 1 |
| :c | 1 |
| :d | 2 |
| :e | 2 |
| :f | 2 |
| :g | 2 |
--------------------
于 2014-04-15T21:33:53.220 回答
-1
""选择 ?x WHERE { ?x rdfs:subClassOf* ?y. }
使用 subClassof* 也可以获取所有子类及其子类。
于 2021-04-23T10:25:31.410 回答