Neo4j Aura 和 uuid 问题

问题描述

运行这个 GraphQL 突变

  "Convenience mutation to destructively update DataPoints for a specific SurveyResponse and question. Accepts answers and/or value. This mutation deletes existing relationships that represent answer data. Returns a DataPoint."
  AnswerQuestion(
    "The id of the question"
    id: ID!
    surveyResponse: ID!
    answers: [ID] = []
    value: String = null
  ): DataPoint
    @hasScope(scopes: ["DataPoint: Update"])
    @cypher(
      statement: """
      MATCH (sr:SurveyResponse) WHERE sr.id = $surveyResponse
      MATCH (q:Question) WHERE q.id = $id
      OPTIONAL MATCH (sr)--(oldDp:DataPoint)--(q)
      DETACH DELETE oldDp
      MERGE (sr)-[:HAS_DATA_POINT]->(dp:DataPoint {id: coalesce(dp.id,apoc.create.uuid())})-[:FOR_QUESTION]->(q)
      WITH dp,q
      FOREACH (o IN CASE WHEN $value IS NOT NULL THEN [true] ELSE [] END | MERGE (dp)-[:ANSWERS {value: $value,propToWrite: q.propToWrite}]->(q))
      WITH dp,q
      OPTIONAL MATCH (a:Answer) WHERE a.id IN $answers
      FOREACH (o IN CASE WHEN a IS NOT NULL THEN [a] ELSE [] END | MERGE (dp)-[:SELECTED_ANSWER]->(a))
      RETURN dp
      """
    )

导致在 aura 上出现此类错误消息(4.2.0. 企业版 - 无论是针对领导节点还是跟随节点运行):

未能调用过程apoc.cypher.doIt:引起:IndexEntryConflictException{propertyValues=( String("always-the-same-id-that-has-nothing-to-do-with-the-queried-data" ) ),addednodeId=-1,existingNodeId=n}``` 其中“always-the-same-id-that-has-nothing-to-do-with-the-queried-data”和“n”是不重要的值.

同样的突变在 localhost(4.2.7 社区版)上运行良好。

当我在所有节点上查询 id(“always-the-same-id-that-has-nothing-to-do-with-the-queried-data”)时,我看到一个 DataPoint 和另一个节点没有连接。删除 DataPoint 并直接在 neo 中运行下面的简化查询会产生相同的错误消息。

      MATCH (sr:SurveyResponse) WHERE sr.id = $surveyResponse
      MATCH (q:Question) WHERE q.id = $id
      OPTIONAL MATCH (sr)--(oldDp:DataPoint)--(q)
      DETACH DELETE oldDp
      MERGE (sr)-[:HAS_DATA_POINT]->(dp:DataPoint {id: coalesce(dp.id,apoc.create.uuid())})-[:FOR_QUESTION]->(q) RETURN dp

这让我相信在 aura 上创建 uuid 是有缺陷的,但是多次运行 RETURN apoc.create.uuid() 会创建不同的字符串。在 DETACH DELETE 和 MERGE 语句之间插入 WITH sr,q 无效。

解决方法

感谢您成为我的橡皮鸭。

这是使它工作的差异:

+      WITH oldDp,oldDp.id AS oldId,sr,q
       DETACH DELETE oldDp
-      MERGE (sr)-[:HAS_DATA_POINT]->(dp:DataPoint {id: coalesce(oldDp.id,apoc.create.uuid())})-[:FOR_QUESTION]->(q)
+      MERGE (sr)-[:HAS_DATA_POINT]->(dp:DataPoint {id: coalesce(oldId,apoc.create.uuid())})-[:FOR_QUESTION]->(q)

我确信还有大量优化需要完成,但目前这已经足够了,而且效果很好。仍然不知道为什么光环有时表现得如此不同。