我试图了解SPARQL的功能,我想知道这种查询是否可行:
Diagram of my Ontology structure(对不起,我暂时不允许发布图片)
我希望获得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)
这可能吗?还是我必须使用外部逻辑才能实现?
我会很高兴得到任何答案......
答案 0 :(得分:1)
是的,你可以!如果你可以使用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> |
----------------------------------------------------------