问题描述
运行这个 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)
我确信还有大量优化需要完成,但目前这已经足够了,而且效果很好。仍然不知道为什么光环有时表现得如此不同。