首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sparql查询子女、孙子、..。一门课

Sparql查询子女、孙子、..。一门课
EN

Stack Overflow用户
提问于 2014-04-15 20:55:56
回答 2查看 5.4K关注 0票数 4

我有一个猫头鹰档案我建在蛋白酶。什么是sparql查询,它将选择类的所有子类和这些子类的所有子类,以此类推(广度优先搜索方式)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-15 21:33:53

Sparql query Subclass or EquivalentTo可能会回答这个问题,但这个问题及其答案包含了更多的信息,这些信息都是您在这里所要求的。您不能真正执行搜索策略(深度优先与广度优先),但如果从根到子类有唯一的路径,则可以(某种程度上)按子类与根的距离排序子类。首先,让我们获取一些示例数据:

代码语言:javascript
复制
@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的子类

代码语言:javascript
复制
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <https://stackoverflow.com/q/23094361/1281433/>

select ?subclass where {
  ?subclass rdfs:subClassOf* :a
}
代码语言:javascript
复制
------------
| 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?中有更详细的描述。

代码语言:javascript
复制
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
代码语言:javascript
复制
--------------------
| subclass | depth |
====================
| :a       | 0     |
| :b       | 1     |
| :c       | 1     |
| :d       | 2     |
| :e       | 2     |
| :f       | 2     |
| :g       | 2     |
--------------------
票数 11
EN

Stack Overflow用户

发布于 2021-04-23 10:25:31

“”选择?x其中{ ?x rdfs:subClassOf* ?y. }

使用*的子类来获取所有子类及其子类。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23094361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档