WHERE子句中UNION和BIND的用途,实现自动编号

时间:2013-09-29 19:12:36

标签: sparql

我正在尝试使用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 ??

的行

1 个答案:

答案 0 :(得分:2)

会发生的是,union的两个参数都提供了一个解决方案(第二个arg始终提供0),然后投影中的MAX确保选择最高的数字。因此,在大多数情况下,第二个UNION论证实际上没有任何效但是,如果第一个参数没有提供解决方案(因为还没有发票编号),只有第二个参数将提供解决方案,这将被选为最大值,然后插入(+1)作为第一个参数号。

相关问题