簡體   English   中英

Sparql 查詢一個班級的孩子、孫子、..

[英]Sparql query for children, grandchildren, .. of a class

我有一個在 Protege 中構建的 owl 文件。 什么是 sparql 查詢,它將選擇一個類的所有子類和這些子類的所有子類,依此類推(廣度優先搜索方式)?

這可能由Sparql query 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+ ,或者你可以用filter( ?subclass != :a )過濾掉: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     |
--------------------

""SELECT ?x WHERE { ?x rdfs:subClassOf* ?y. }

使用 subClassof* 也可以獲取所有子類及其子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM