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

时间:2014-04-15 20:55:56

标签: sparql owl protege protege4

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

2 个答案:

答案 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* 来获取所有子类及其子类。