设置SPARQL的差异

时间:2014-01-27 20:53:38

标签: sparql

在一些FILTER之后,我最终得到了2套,让我们说A1和A2,我只希望SELECT只有A1中那些没有出现在A2中的元素。我试图使用MINUS,但没有成功。

当我们有类似的东西时:

MINUS { ?s foaf:givenName "Bob" }

我们需要事先知道我们想要减去什么。在我的情况下,我不知道任何属性如`foaf:givenName1,除了它们属于集合A2。 (这是一个财产思想)。

我很困惑。有任何想法吗?

使用CLARITY示例编辑:

SELECT DISTINCT ?x ?y WHERE { 

?x swrc:listAuthor ?y.
?x swrc:author ?w.
FILTER (!regex(?y, " and ")).
?a swrc:listAuthor ?b.
?a swrc:author ?c.
FILTER regex(?b, " and ").
FILTER(?c != ?w).}

所以我想对此做的是以下内容。使用listAuthor,我可以在“John Doe和John Nipper”这样的字符串中获取作者。利用这种格式,我希望让作者单独写一篇论文(在他们的作者列表中没有“和”)。前3行足够了。但也有一些作者撰写了2篇论文,其中1篇是论文,1篇是共同作者。我尝试以某种方式从第一个中减去它们。有任何想法吗?

1 个答案:

答案 0 :(得分:5)

找不到合作者的作者

如果我正确地理解了你的问题,那你就是在试图要求那些从未与其他人共同撰写论文的作者(和他们的论文)。如果论文与:author属性的作者相关,则实际上您不需要匹配作者列表来执行此操作。如果我们有一些数据可以使用,这些问题总是容易得多,所以请考虑这些数据:

@prefix : <http://stackoverflow.com/q/21391444/1281433/> .

:p1 :author :a, :b .
:p2 :author :a .
:p3 :author :b, :c .
:p4 :author :d .
A已经用B写了一篇论文,也单独写过。 B已经用A写了一篇论文,并且还用C.写了一篇论文B.D写了一篇论文。

我们可以使用这样的查询来查找从未合着论文的所有作者(在本例中为D):

prefix : <http://stackoverflow.com/q/21391444/1281433/>

select ?author ?paper where {
  ?paper :author ?author .
  filter not exists { 
    ?paper2 :author ?author, ?otherAuthor .
    filter ( ?author != ?otherAuthor )
  }
}

这对应于英语:

  

与作者一起查找论文,使得该作者没有其他作者的论文。

我们得到了预期的结果:

------------------
| author | paper |
==================
| :d     | :p4   |
------------------

如果您仍想基于作者列表字符串中的正则表达式进行挑选和排除,则可以使用

进行选择和排除
prefix : <http://stackoverflow.com/q/21391444/1281433/>

select ?author ?paper where {
  # find authors of papers with no coauthors
  ?paper :author ?author ; :listAuthor ?list .
  filter(!regex(?list," and "))

  # and remove those that coauthored some paper
  filter not exists { 
    ?paper2 :author ?author ; :listAuthor ?list2 .
    filter(regex(?list2," and "))
  }
}

调试原始查询

原始查询可以缩写为以下内容,除了一些语法糖之外,它们完全相同。

SELECT DISTINCT ?x ?y WHERE { 
  ?x swrc:listAuthor ?y ; swrc:author ?w.
  FILTER (!regex(?y, " and ")).

  ?a swrc:listAuthor ?b ; swrc:author ?c.
  FILTER regex(?b, " and ").

  FILTER(?c != ?w).
}

除最后的filter外,?x?y?w上的模式与?a上的模式完全分开,{{ 1}}和?b。从第一个模式开始,每个论文的每个作者只需要一个作者就可以获得一个绑定(这意味着每个论文只有一个作者就有一个绑定)。从第二种模式中,您将为每篇论文的每位作者与多位作者进行一次绑定。然后你基本上采用这两组(作者,纸)对的笛卡尔积,得到一个表格的绑定(paper1,author1,paper2,author2),然后最后的?c说“删除”任何绑定,其中author1与author2相同。

考虑一下这对我上面给出的数据意味着什么,但让我们看一下论文filter:p1。自:p2单独创作:a以来,我们:p1:a?w:p1

?x

但是,由于?x ?w ------- :p1 :a 还使用:a创作了论文:p2,因此我们会为:b?a添加一些行:

?c

现在笛卡儿产品是:

?a   ?c
-------
:p2  :a
:p2  :b

过滤器删除了第一行,留下了

?x  ?w  ?a  ?c
--------------
:p1 :a  :p2 :a
:p1 :a  :p2 :b

并且?x ?w ?a ?c -------------- :p1 :a :p2 :b :a,即使?w与某人合作。一般来说:

  • 每篇:a都是一篇论文,其中包含一位作者(?x)。
  • 每个?w都是单独撰写论文的作者(?w)。
  • 每篇?x都是包含多位作者的论文,其中一位是?a,其中一位(?c)单独撰写论文(?w)。
  • 每个?x都是撰写论文的作者(?c某人(?a)共同撰写论文({{1} }})。