繁体   English   中英

SPARQL:查询以获取与第三个类共享相同连接的两个类的所有实例

[英]SPARQL: Query to get all Instances of two classes that share the same connections to a third class

我试图了解SPARQL的功能,我想知道这种查询是否可行:

我的Ontology结构图 (抱歉,我还不允许发布图片)

我想获得A类和B类的所有实例,这些实例与B类的相同实例有连接。所以某种形式:

Select ?a, ?c
Where
{
 ?a myOntology:ab ?c .
 ?c myOntology:cb ?B .
}

哪个会给我:

A:1 C:1
A:2 C:1 (with B:2)
A:2 C:1 (with B:3)

(字母是类和实例的数字,从顶部算起)

但不同的是,我只想要那些与B完全相同的相关实例:

A:2 C:1 (with B:2 and B:3)

这是可能的还是我必须使用外部逻辑才能实现?

我会很高兴得到任何答案......

是的你可以! 如果你可以使用NOT EXISTS。

与SQL一样,SPARQL没有通用量词,但您可以使用嵌套的NOT EXISTS-s。

你的查询在伪SPARQL中,“给我所有对(a,c)这样abc使得没有其他bb这样a-bb而不是bb-c ---和vise verse:bb-c而不是a- BB“:

PREFIX : <http://test/>
SELECT ?a ?b ?c
WHERE 
{ ?a :ab ?b .
  ?b :bc ?c .
  FILTER NOT EXISTS
  { ?a :ab ?bb .
    FILTER NOT EXISTS
    {  ?bb :bc ?c . } 
  }
  ## vise verse:
  FILTER NOT EXISTS
  { ?bb :bc ?c .
    FILTER NOT EXISTS
    {  ?a :ab ?bb . } 
  }
}

运行它

@prefix : <http://test/> .
:a1 :ab :b1 .
:a1 :ab :b2 .
:a2 :ab :b2 .
:a2 :ab :b3 .
:b2 :bc :c1 .
:b3 :bc :c1 .

----------------------------------------------------------
| a                | b                | c                |
==========================================================
| <http://test/a2> | <http://test/b3> | <http://test/c1> |
| <http://test/a2> | <http://test/b2> | <http://test/c1> |
----------------------------------------------------------

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM