我有一个猫头鹰档案我建在蛋白酶。什么是sparql查询,它将选择类的所有子类和这些子类的所有子类,以此类推(广度优先搜索方式)?
发布于 2014-04-15 21:33:53
Sparql query Subclass or 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+,也可以使用filter( ?subclass != :a )筛选出:a。
在从根到子类只有一条路径的情况下,可以计算它们之间的中间节点以确定它们的深度。如果你以这种方式按深度排序,那么你就会得到你的结果,就像第一次搜索的广度会给你以下所示。该技术在Is it possible to get the position of an element in an RDF Collection in SPARQL?和Calculate length of path between nodes?中有更详细的描述。
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 |
--------------------发布于 2021-04-23 10:25:31
“”选择?x其中{ ?x rdfs:subClassOf* ?y. }
使用*的子类来获取所有子类及其子类。
https://stackoverflow.com/questions/23094361
复制相似问题