gpt4 book ai didi

sparql - 在 SPARQL 中设置差异

转载 作者:行者123 更新时间:2023-12-02 01:07:02 26 4
gpt4 key购买 nike

经过一些FILTER,我最终得到了 2 个集合,比方说 A1 和 A2,我只想SELECT A1 中没有出现在 A2 中的那些元素。我尝试使用 MINUS 但没有成功。

当我们有这样的事情时:

MINUS { ?s foaf:givenName "Bob" }

我们需要事先知道我们要减去什么。在我的例子中,除了它们属于集合 A2 之外,我不知道任何类似 `foaf:givenName1 的属性。 (这是一种属性(property)思想)。

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

为清楚起见编辑示例:

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 and John Nipper”的字符串中找到作者。利用这种格式,我想让单独写一篇论文的作者(他们的作者列表中没有“和”)。前 3 行就足够了。但也有一些作者写了 2 篇论文,1 篇是单独的,1 篇是合着的。我试图以某种方式从第一个中减去它们。有任何想法吗?

最佳答案

寻找没有合著者的作者

如果我对您的问题的理解正确,那么您是在尝试寻找从未与他人合着过论文的作者(及其论文)。如果论文通过 :author 与作者相关,您实际上不需要匹配作者列表来执行此操作。属性(property)。如果我们有一些数据可以处理,这些问题总是容易得多,所以请考虑以下数据:

@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 一起写了一篇论文。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 )
}
}

这对应英文:

Find papers with authors such that there is no paper by that author with another author.

我们得到了预期的结果:

------------------
| 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 "))
}
}

调试原始查询

原来的query可以简写如下,除了一些语法糖外,完全一样。

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 上的模式完全分开, ?b , 和 ?c .从第一个模式开始,您将为每篇论文的每位作者获得一个绑定(bind),只有一位作者(这意味着每篇论文只有一位作者的绑定(bind))。在第二种模式中,您将为每篇具有多位作者的论文的每位作者获得一个绑定(bind)。然后,您实质上是采用这两组 (author,paper) 对的笛卡尔积,以获得形式为 (paper1,author1,paper2,author2) 的绑定(bind),然后是最终的 filter。说“删除 author1 与 author2 相同的所有绑定(bind)。

考虑这对我上面给出的数据意味着什么,但我们只看论文 :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) 的人 (?w) 合着了一篇论文 (?x) 的作者。

关于sparql - 在 SPARQL 中设置差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21391444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com