带有 id 的边已经存在 - Gremlin
Edge with id already exists - Gremlin
我正在使用以下命令使用 Gremlin 插入边。我正在按照 here 中提到的食谱进行操作。这是我正在使用的代码。 lambda 中的代码 运行s 与托管在 Amazon Neptune
中的集群对话
public void createEdge(final String id, final String label, final String fromId, final String toId, final Map<String, String> properties) {
this.graphTraversalSource
.V(fromId) // get vertex of id given for the source
.as("fromVertex") // label as fromVertex to be accessed later
.V(toId) // get vertex of id given for destination
.coalesce( // evaluates the provided traversals in order and returns the first traversal that emits at least one element
inE(label) // check incoming edge of label given
.has(T.id, id) // also check for incoming edge of given ID
.where( // conditional check to check if edge exists
outV() // get destination vertex of the edge to check
.as("fromVertex")), // against staged vertex
addE(label) // add edge if not present
.property(T.id, id) // with given id
.from("fromVertex")) // from source vertexx
.next(); // end traversal to commit to graph
log.info("Created edge {} if it doesn't exists between {} and {}", id, fromId, toId);
}
与 tinkerpop 网站中提到的示例食谱的唯一区别是我添加了这一步。就我而言,我想在具有相同标签但不同 ID
的相同顶点之间创建多条边
.has(T.id, id) // also check for incoming edge of given ID
但我收到以下异常
Caused by: java.util.concurrent.CompletionException: org.apache.tinkerpop.gremlin.driver.exception.ResponseException:
{
"detailedMessage": "Edge with id already exists: 123",
"requestId": "dce46db8-1d0a-4717-a412-ee831973b177",
"code": "ConstraintViolationException"
}
然而,当我 运行 在 gremlin 控制台中进行相同的查询时,实验成功了。以下查询,我执行了多少次,返回相同的边缘。但是远程 gremlin 服务器没有发生同样的事情
g.V().has('product','id','C1').as('v1').V().has('product','id','C2').coalesce(__.inE('rel').has('id', 'E1').where(outV().as('v1')), addE('rel').property('id', 'E1').from('v1')).next()
谁能帮我解决这个错误
谢谢
您上面的查询(Lambda 函数代码)和您在问题末尾引用的查询有一个主要区别。在问题末尾的查询中:
g.V().has('product','id','C1').as('v1').
V().has('product','id','C2').
coalesce(
__.inE('rel').has('id', 'E1').where(outV().as('v1')),
addE('rel').property('id', 'E1').from('v1')).
next()
此查询使用 has('id','E1')
检查边的 ID,而不是 has(T.id,...)
。 has('id'
正在寻找名为 'id' 的自定义 属性,而 has(T.id
正在寻找实际的边缘 ID。
property('id'
也是如此。如果使用 (property('id'
,Neptune(特别是)将在创建边时为边的 T.id 值创建一个 UUID。因此,您最终会得到许多具有不同 T.id 但相同 id
属性.
的边
注意:在 Python 中编码时,您只需要使用 T.id
符号。如果使用 Gremlin 控制台,您只需使用 has(id,"myId")
或 property(id,"myId")
。 id
.
周围没有引号
我正在使用以下命令使用 Gremlin 插入边。我正在按照 here 中提到的食谱进行操作。这是我正在使用的代码。 lambda 中的代码 运行s 与托管在 Amazon Neptune
中的集群对话 public void createEdge(final String id, final String label, final String fromId, final String toId, final Map<String, String> properties) {
this.graphTraversalSource
.V(fromId) // get vertex of id given for the source
.as("fromVertex") // label as fromVertex to be accessed later
.V(toId) // get vertex of id given for destination
.coalesce( // evaluates the provided traversals in order and returns the first traversal that emits at least one element
inE(label) // check incoming edge of label given
.has(T.id, id) // also check for incoming edge of given ID
.where( // conditional check to check if edge exists
outV() // get destination vertex of the edge to check
.as("fromVertex")), // against staged vertex
addE(label) // add edge if not present
.property(T.id, id) // with given id
.from("fromVertex")) // from source vertexx
.next(); // end traversal to commit to graph
log.info("Created edge {} if it doesn't exists between {} and {}", id, fromId, toId);
}
与 tinkerpop 网站中提到的示例食谱的唯一区别是我添加了这一步。就我而言,我想在具有相同标签但不同 ID
的相同顶点之间创建多条边.has(T.id, id) // also check for incoming edge of given ID
但我收到以下异常
Caused by: java.util.concurrent.CompletionException: org.apache.tinkerpop.gremlin.driver.exception.ResponseException:
{
"detailedMessage": "Edge with id already exists: 123",
"requestId": "dce46db8-1d0a-4717-a412-ee831973b177",
"code": "ConstraintViolationException"
}
然而,当我 运行 在 gremlin 控制台中进行相同的查询时,实验成功了。以下查询,我执行了多少次,返回相同的边缘。但是远程 gremlin 服务器没有发生同样的事情
g.V().has('product','id','C1').as('v1').V().has('product','id','C2').coalesce(__.inE('rel').has('id', 'E1').where(outV().as('v1')), addE('rel').property('id', 'E1').from('v1')).next()
谁能帮我解决这个错误
谢谢
您上面的查询(Lambda 函数代码)和您在问题末尾引用的查询有一个主要区别。在问题末尾的查询中:
g.V().has('product','id','C1').as('v1').
V().has('product','id','C2').
coalesce(
__.inE('rel').has('id', 'E1').where(outV().as('v1')),
addE('rel').property('id', 'E1').from('v1')).
next()
此查询使用 has('id','E1')
检查边的 ID,而不是 has(T.id,...)
。 has('id'
正在寻找名为 'id' 的自定义 属性,而 has(T.id
正在寻找实际的边缘 ID。
property('id'
也是如此。如果使用 (property('id'
,Neptune(特别是)将在创建边时为边的 T.id 值创建一个 UUID。因此,您最终会得到许多具有不同 T.id 但相同 id
属性.
注意:在 Python 中编码时,您只需要使用 T.id
符号。如果使用 Gremlin 控制台,您只需使用 has(id,"myId")
或 property(id,"myId")
。 id
.