gpt4 book ai didi

用于获取仅具有部分属性而非全部属性的实例的 SPARQL 查询

转载 作者:行者123 更新时间:2023-12-02 06:13:33 25 4
gpt4 key购买 nike

假设我有以下形式的三元组

uri:ObjA1 uri:propAA uri:Obj1A .
uri:ObjA1 uri:propAA uri:Obj1B .

uri:ObjA2 uri:propAA uri:Obj1A .
uri:ObjA2 uri:propAA uri:Obj1B .
uri:ObjA2 uri:propAA uri:Obj1C .

现在,我想做的是找到仅具有 propAA 值 Obj1A 和 Obj1B 的所有实例。基本上,查询应该返回 ObjA1 而不是 ObjA2,因为只有 ObjA1 才为 propAA 获取值 Obj1A 和 Obj1B。我现在拥有的是

SELECT * where {
?sub uri:propAA uri:Obj1A .
?sub uri:propAA uri:Obj1B .
FILTER NOT EXISTS {
?sub uri:propAA ?obj .
FILTER((?obj != uri:Obj1A) && (?obj != uri:Obj1B)) .
}
}

现在,这个查询可以工作了。如果我不添加 FILTER NOT EXISTS 子句,那么它会同时返回 ObjA1 和 ObjA2。我现在想要知道是否有更好的方法来编写这个查询?更好意味着更高效或更简洁(或两者兼而有之)。

最佳答案

您可以使用 NOT IN 运算符稍微缩短内容,也可以使用 , 连接器来避免重复三重模式:

SELECT * where {
?sub uri:propAA uri:Obj1A, uri:Obj1B .
FILTER NOT EXISTS {
?sub uri:propAA ?obj .
FILTER(?obj NOT IN (uri:Obj1A, uri:Obj1B))
}
}

我怀疑这两种改变在性能方面都会产生影响,但它更简洁,而且(恕我直言)更容易阅读。

FWIW,这里的双重否定是重写通用量化的经典方法。毕竟,从逻辑上讲,∀x P(x) 等于∄x ØP(x)。由于 SPARQL 没有 FORALL 运算符,因此您必须使用 NOT EXISTS 和双重否定。

关于用于获取仅具有部分属性而非全部属性的实例的 SPARQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426792/

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