对于整个查询,我需要一个唯一的id(uuid),与匹配数无关。
考虑以下数据
@prefix ex:<http://www.example.org/>
ex:John ex:knows ex:Kathrin.
ex:John ex:knows ex:Peter.
ex:John ex:worksAt ex:coolShop.
数据告诉我们约翰认识一些人并且在coolShop工作。
现在我们有一个INSERT查询:
1 PREFIX ex:<http://www.example.org/>
2 INSERT{
3 ?john ex:knows ex:Alan.
4 ?john ex:hasRandomUUID ?uuid.
5 }
6 WHERE{
7 ?john ex:knows ?friend.
8 OPTIONAL{
9 ?john ex:worksAt ?shop
10 BIND(STRUUID() AS ?uuid)
11 }
12 }
此查询插入john认识Alan。
此外,我想为约翰插入由?john ex:hasRandomUUID ?uuid
表示的唯一ID。但是我只想在John在某个地方工作时添加此唯一ID。因此,我们在可选子句中绑定BIND(STRUUID() AS ?uuid)
。因此,如果?john ex:worksAt ?shop
匹配,我们将唯一的ID绑定到?uuid
。 (假设一个人只能一次在某个地方工作,并假设可选子句中可能有不止一个三元组。)
到目前为止很好。
我现在的问题是,由于第7行中的?john ex:knows ?friend
匹配两次,BIND(STRUUID() AS ?uuid)
被两次求值,因此生成了2个不同的uuid。由于会生成2个不同的uuid,因此即使我只想要一个,也会插入ex:John ex:hasRandomUUID uuid
形式的两个三元组。
我该如何确保仅创建一个uuid来独立于任何匹配项,或者仅插入形式ex:John ex:hasRandomUUID uuid
的三分之一。
请不要让我不能使用Bind(ex:John AS ?john)
之类的东西代替第6行。
我与Apache Jena Fuseki合作。
非常感谢您。
编辑: 这对我有用:
1 PREFIX ex:<http://www.example.org/>
2 INSERT{
3 ?john ex:knows ex:Alan.
4 ?john ex:hasRandomUUID ?uuid.
5 }
6 WHERE{
7 ?john ex:knows ?friend.
8 {
9 OPTIONAL{
10 ?john ex:worksAt ?shop
11 BIND(STRUUID() AS ?uuid)
12 }
13 }
14 }
通过添加第8行和第13行,将整个OPTIONAL
子句放入子查询中。这导致STRUUID()
仅被评估一次,并且仅以ex:John ex:hasRandomUUID uuid
形式的三倍被插入到数据集中。
答案 0 :(得分:3)
一种方法是在查询匹配?john
时分配潜在ID,然后在需要时将其分配给实际变量:
WHERE
{
?john ex:knows ?friend .
BIND ( STRUUID() AS ?uuidX )
{
OPTIONAL
{
?john ex:worksAt ?shop .
BIND ( ?uuidX AS ?uuid )
}
}
}