Sparql 在WHERE子句中联合和绑定的目的,实现自动编号
我正在尝试使用sparql/sesame查询实现递增/递减。我遇到了一个问题,提出了这个问题:Sparql 在WHERE子句中联合和绑定的目的,实现自动编号,sparql,Sparql,我正在尝试使用sparql/sesame查询实现递增/递减。我遇到了一个问题,提出了这个问题: INSERT { _:ex a ex:Invoice ; ex:number ?next . } WHERE { { SELECT ((MAX(?number) + 1) AS ?next) WHERE { { ?x ex:number ?number ; a ex:Invoic
INSERT {
_:ex a ex:Invoice ;
ex:number ?next .
}
WHERE {
{
SELECT ((MAX(?number) + 1) AS ?next)
WHERE {
{ ?x ex:number ?number ;
a ex:Invoice }
UNION
{ BIND (0 AS ?number) }
}
}
}
我不理解where
子句中union
的目的。在where
子句和bind
子句中发生了什么?如果bind
绑定的值不存在三元组,则该值是否用作默认值,这意味着0
将是第一个数字
编辑:后续:
快速澄清…我的帖子中的查询(使用coalesce)将插入多行(这是该查询的目的)。如何将该查询修改为仅递增/递减1行??如果我在插入之前添加DELETE,那么行为会是什么?下一个在被选中之前是否会被删除/
DELETE {
_:ex a ex:Invoice ;
ex:number ?object .
}
INSERT {
_:ex a ex:Invoice ;
ex:number ?next .
}
WHERE {
{
SELECT ((MAX(?number) + 1) AS ?next)
WHERE {
{ ?x ex:number ?number ;
a ex:Invoice }
UNION
{ BIND (0 AS ?number) }
}
}
}
我是否可以使用上面的查询仅增加1行,并首次插入值为0的行?是
所发生的情况是,union的两个参数都提供了一个解决方案(第二个参数始终提供0),然后投影中的MAX确保选择了最大值。因此,在大多数情况下,第二个工会论点实际上毫无作用。但是,如果第一个参数没有提供解决方案(因为还没有发票号),则只有第二个参数提供解决方案,该参数将被选为最大值,然后插入(+1)作为第一个数字。如果您使用的是类似于该解决方案的解决方案,我也刚刚发布了该问题;您可以使用更简单的
select(coalesce(max(?number),0)+1作为?next),其中{…}
代替此联合模式。也就是说,“?下一个是一个加号(max(?number)
,如果不是错误,则为0
)。你根本不需要把引擎变成一个联合体。酷…感谢分享快速澄清…我的帖子中的查询(使用coalesce)将插入多行(这是该查询的目的)。如何将该查询修改为仅递增/递减1行??如果我在插入之前添加DELETE,那么行为会是什么?下一个对象是否会在其所选对象之前被删除?/因为?对象仅在删除中提及,您的删除不是全部吗?我发布的select查询应该只返回一行,所以我认为应该只插入insert模式的一个实例。