如何从 INSERT Sparql 请求中获取 UUID()?
How to get UUID() from INSERT Sparql Request?
我想知道是否有可能检索 UUID() urn: 在 SPARQL 查询中使用 INSERT 语句时?
我的问题很简单,但我不知道如何使用 SPARQL 解决它:
我想存储很多时间戳值。相同的时间戳可以出现多次,所以我想我可以使用 UUID() 来生成随机 URI。
我需要 urn: from UUID() 函数来关联我的新三元组。
我是正确的 ?
或者 UUID() 不是解决方案?
感谢您的帮助。
编辑:
好的,所以我不得不说我想在我的 python 代码中检索数据。
我正在使用 SPARQLWrapper 来 运行 我的请求。
如果我创建一个这样的 INSERT 请求:
INSERT {
?uuid1 rdf:type capt:ECHANTILLON .
?uuid1 capt:Nom ?uuid1 .
?uuid1 capt:Description '2019-08-07 16:07:34.027636' .
?uuid1 capt:Valeur '1565182189' .
} WHERE {
FILTER NOT EXISTS { ?uuid1 rdf:type capt:ECHANTILLON} .
BIND (UUID() AS ?uuid1) .
};
然后另一个 INSERT 请求使用第一个中的 ?uuid1 :
INSERT {
?uuid2 rdf:type capt:VALEUR .
?uuid2 capt:Nom ?uuid2 .
?uuid2 capt:Description '2019-08-07 16:07:34.027659' .
?uuid2 capt:Valeur '27.0' .
**?uuid1 capt:A_Pour_Valeur ?uuid2 .** <===
} WHERE {
FILTER NOT EXISTS { ?uuid2 rdf:type capt:VALEUR} .
BIND (UUID() AS ?uuid2) .
};
我想要的是:
uuid1 = endpoint.setQuery(request_1)
request_2.addSubject(uuid1)
uuid2 = endpoint.setQuery(request_2)
类似的东西。
如果 INSERT 没有 return 这个值,我如何从第一个请求中检索 ?uuid1?如果可能的话,我想提出两个要求。
我是要在一个请求中重新组合两个请求,还是要 运行 一个 SELECT ?uuid1 请求在 运行 秒之前?
您无法直接从 SPARQL 更新中获取 UUID 的值 - 如果您想通过 SPARQL 以某种方式检索它,则必须在插入它之后进行查询 - 或者,当然,您可以调整您的第二个 SPARQL 更新,通过在其 WHERE 子句中查询 'correct' UUID 来为您进行选择。
但是,在这种情况下,这看起来很难做到,我认为对您来说最简单的解决方案是您不在 SPARQL 操作本身中创建 UUID,而是在代码中创建它,然后使用它在您的查询字符串中,例如通过添加 VALUES 子句,如下所示:
import uuid
uuid1 = uuid.uuid1()
update = """INSERT { .... }
WHERE { VALUES ?uuid1 { <urn:uuid:""" + uuid1 + """> }
FILTER NOT EXISTS .... (etc) }"""
我想知道是否有可能检索 UUID() urn: 在 SPARQL 查询中使用 INSERT 语句时? 我的问题很简单,但我不知道如何使用 SPARQL 解决它: 我想存储很多时间戳值。相同的时间戳可以出现多次,所以我想我可以使用 UUID() 来生成随机 URI。 我需要 urn: from UUID() 函数来关联我的新三元组。 我是正确的 ? 或者 UUID() 不是解决方案?
感谢您的帮助。
编辑:
好的,所以我不得不说我想在我的 python 代码中检索数据。 我正在使用 SPARQLWrapper 来 运行 我的请求。
如果我创建一个这样的 INSERT 请求:
INSERT {
?uuid1 rdf:type capt:ECHANTILLON .
?uuid1 capt:Nom ?uuid1 .
?uuid1 capt:Description '2019-08-07 16:07:34.027636' .
?uuid1 capt:Valeur '1565182189' .
} WHERE {
FILTER NOT EXISTS { ?uuid1 rdf:type capt:ECHANTILLON} .
BIND (UUID() AS ?uuid1) .
};
然后另一个 INSERT 请求使用第一个中的 ?uuid1 :
INSERT {
?uuid2 rdf:type capt:VALEUR .
?uuid2 capt:Nom ?uuid2 .
?uuid2 capt:Description '2019-08-07 16:07:34.027659' .
?uuid2 capt:Valeur '27.0' .
**?uuid1 capt:A_Pour_Valeur ?uuid2 .** <===
} WHERE {
FILTER NOT EXISTS { ?uuid2 rdf:type capt:VALEUR} .
BIND (UUID() AS ?uuid2) .
};
我想要的是:
uuid1 = endpoint.setQuery(request_1)
request_2.addSubject(uuid1)
uuid2 = endpoint.setQuery(request_2)
类似的东西。
如果 INSERT 没有 return 这个值,我如何从第一个请求中检索 ?uuid1?如果可能的话,我想提出两个要求。 我是要在一个请求中重新组合两个请求,还是要 运行 一个 SELECT ?uuid1 请求在 运行 秒之前?
您无法直接从 SPARQL 更新中获取 UUID 的值 - 如果您想通过 SPARQL 以某种方式检索它,则必须在插入它之后进行查询 - 或者,当然,您可以调整您的第二个 SPARQL 更新,通过在其 WHERE 子句中查询 'correct' UUID 来为您进行选择。
但是,在这种情况下,这看起来很难做到,我认为对您来说最简单的解决方案是您不在 SPARQL 操作本身中创建 UUID,而是在代码中创建它,然后使用它在您的查询字符串中,例如通过添加 VALUES 子句,如下所示:
import uuid
uuid1 = uuid.uuid1()
update = """INSERT { .... }
WHERE { VALUES ?uuid1 { <urn:uuid:""" + uuid1 + """> }
FILTER NOT EXISTS .... (etc) }"""