3

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

我不明白条款union中的目的wherewhere子句和?中发生了bind什么?如果不存在三元组,则该值是否被bind用作默认值,这意味着0它将是第一个数字?

编辑:跟进:

快速澄清......我帖子中的查询(使用合并)将插入多行(这是该查询的意图)。如何修改该查询以仅增加/减少 1 行?如果我在插入之前添加 DELETE,那么行为是什么??next 会在它被选中之前被删除吗???/

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 的行吗?

4

1 回答 1

2

是的。

发生的情况是联合的两个参数都提供了一个解决方案(第二个参数始终提供 0),然后投影中的 MAX 确保选择了最大的数字。因此在大多数情况下,第二个 UNION 参数实际上什么都不做。然而,在第一个参数没有提供解决方案的情况下(因为还没有发票编号),只有第二个参数将提供一个解决方案,这将被选为最大值,然后插入 (+1) 作为第一个数字。

于 2013-09-29T20:34:58.803 回答