带有 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.

周围没有引号