【问题标题】:Neo4j Syntax Exception while creating an apoc procedure inside a apoc trigger在 apoc 触发器中创建 apoc 过程时出现 Neo4j 语法异常
【发布时间】:2020-07-14 17:35:13
【问题描述】:

我正在一个 apoc 触发器中创建一个 apoc 过程。日志中的错误说明了这一点

" org.neo4j.exceptions.SyntaxException:变量 node 未定义(第 1 行,第 26 列(偏移量:25)) "MATCH(p1:SPerson { name: node.name}) CREATE (p1)-[:Enrolled]->(c)"

"

我的 apoc 触发代码

 CALL apoc.trigger.add('loadEnrollments',   
"UNWIND apoc.trigger.nodesByLabel($assignedLabels, 'Enrollment') AS node
 MERGE (p1:SPerson { name: node.name, cell: node.cell, created_at: node.created_at})
 WITH p1, node
 MATCH (c:Course {name: 'Paradigm Shifting 101'})
 MATCH (n:SPerson)
 WITH p1, node, COUNT(n) as size
 CALL apoc.do.when(
 size>3,'MERGE (p1)-[:Waitlist]->(c)',
 'MATCH(p1:SPerson { name: node.name}) CREATE (p1)-[:Enrolled]->(c)') YIELD value
 DETACH DELETE node", 
 { phase: 'after' });

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    关于您的直接问题,您需要将node 传递给apoc.do.when,以便其内部查询可以访问它。

    但是,实际上,您应该更改查询,以便内部查询甚至不需要执行MATCH

    CALL apoc.trigger.add(
      'loadEnrollments',   
      "UNWIND apoc.trigger.nodesByLabel($assignedLabels, 'Enrollment') AS node
       MERGE (p1:SPerson { name: node.name, cell: node.cell, created_at: node.created_at})
       WITH p1, node
       MATCH (c:Course {name: 'Paradigm Shifting 101'})
       MATCH (n:SPerson)
       WITH p1, c, node, COUNT(n) as size
       CALL apoc.do.when(
         size>3,
         'MERGE (p1)-[:Waitlist]->(c)',
         'MERGE (p1)-[:Enrolled]->(c)',
         {p1: p1, c: c}
       ) YIELD value
       DETACH DELETE node", 
       { phase: 'after' }
    );
    

    【讨论】:

    • 谢谢!那行得通。此外,您建议“内部查询甚至不需要进行匹配”。这是标准做法吗?
    • 一般来说,一旦你已经有了一个节点,你应该避免重新执行一个节点的查询。
    • 谢谢。这是有道理的。您能否就以下问题向我提出一些建议。非常感谢您的专业知识。 stackoverflow.com/questions/62943204/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多