为整个SPARQL查询创建唯一的ID

时间:2018-12-13 20:20:01

标签: sparql rdf optional uuid fuseki

对于整个查询,我需要一个唯一的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形式的三倍被插入到数据集中。

1 个答案:

答案 0 :(得分:3)

一种方法是在查询匹配?john时分配潜在ID,然后在需要时将其分配给实际变量:

WHERE
  {
    ?john ex:knows ?friend .
    BIND ( STRUUID() AS ?uuidX )
    {
      OPTIONAL
        {
          ?john ex:worksAt ?shop .
          BIND ( ?uuidX AS ?uuid )
        }
    }
  }