在一些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篇是共同作者。我尝试以某种方式从第一个中减去它们。有任何想法吗?
答案 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} }})。