我正在尝试使用sparql / sesame查询实现递增/递减。我遇到了How to model consecutive numbering without transactions?,提出了这个问题:
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) }
}
}
}
我不理解union
条款中where
的目的。 where
子句和bind
中发生了什么? bind
的值是否作为默认值使用,如果没有三元组,这意味着0
将成为第一个数字?
编辑:后续:
快速澄清....我的帖子中的查询(带合并)将插入多行(这是该查询的意图)。如何修改该查询只增加/减少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 ??
的行答案 0 :(得分:2)
是
会发生的是,union的两个参数都提供了一个解决方案(第二个arg始终提供0),然后投影中的MAX确保选择最高的数字。因此,在大多数情况下,第二个UNION论证实际上没有任何效但是,如果第一个参数没有提供解决方案(因为还没有发票编号),只有第二个参数将提供解决方案,这将被选为最大值,然后插入(+1)作为第一个参数号。