Sparql 在WHERE子句中联合和绑定的目的,实现自动编号

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

我正在尝试使用sparql/sesame查询实现递增/递减。我遇到了一个问题,提出了这个问题:

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模式的一个实例。