4

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

我的本体结构图(对不起,我还不允许发布图片)

我想获取与 B 类的相同实例有连接的 A 类和 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)

这是可能的还是我必须使用外部逻辑来获得它?

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

4

1 回答 1

1

是的你可以!如果你可以使用不存在。

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

您的查询是,在伪 SPARQL 中,“给我所有对 (a,c),这样 abc 就没有其他 bb 这样 a-bb 而不是 bb-c --- 并且虎钳诗句: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> |
----------------------------------------------------------
于 2012-10-11T19:27:46.427 回答