我有一个我在Protege中构建的猫头鹰文件。什么是sparql查询,它将选择类的所有子类以及这些子类的所有子类,依此类推(广度优先搜索排序方式)?
答案 0 :(得分:7)
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+
,或者可以使用{{过滤掉:a
1}}。
如果从根到子类有一条路径,您可以计算它们之间的中间节点以确定它们的深度。如果您以这种方式按深度排序,那么您将得到的结果类似于广度优先搜索会给您提供以下内容。 Is it possible to get the position of an element in an RDF Collection in SPARQL?和Calculate length of path between nodes?中详细介绍了此技术。
filter( ?subclass != :a )
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
答案 1 :(得分:-1)
""SELECT ?x 在哪里 { ?x rdfs:subClassOf* ?y。 }
使用 subClassof* 来获取所有子类及其子类。