如何用单个Neo4j查询创建节点与关系的图?报错修复及替代方案
修复Neo4j节点与关系创建的Cypher语法错误
问题背景
目标创建的图结构:
___A____ / | \ AA AB AC
编写的错误查询语句:
create a = (:Task {title:"A"}), aa = (:Task {title:"AA"}), ab = (:Task {title:"AB"}), ac = (:Task {title:"AC"}), (a)-[:DEPENDS_ON]->(aa), (a)-[:DEPENDS_ON]->(ab), (a)-[:DEPENDS_ON]->(ac) return *;
执行后报错:
Neo.ClientError.Statement.SyntaxError Type mismatch: a defined with
conflicting type Path (expected Node) (line 6, column 4 (offset: 125))
" (a)-[:DEPENDS_ON]->(aa),"
^
需要解决:能否用单个查询实现?如果不行,最简单的替代方案是什么?
解决方案
单查询完全可以实现,两种修复写法:
- 拆分节点与关系的CREATE子句
把节点创建和关系创建分成两个独立的CREATE块,避免变量类型冲突:
CREATE a = (:Task {title:"A"}), aa = (:Task {title:"AA"}), ab = (:Task {title:"AB"}), ac = (:Task {title:"AC"}) CREATE (a)-[:DEPENDS_ON]->(aa), (a)-[:DEPENDS_ON]->(ab), (a)-[:DEPENDS_ON]->(ac) RETURN *;
- 链式创建节点与关系
用更简洁的链式语法直接关联节点,无需先单独赋值变量再创建关系:
CREATE (a:Task {title:"A"})-[:DEPENDS_ON]->(aa:Task {title:"AA"}), (a)-[:DEPENDS_ON]->(ab:Task {title:"AB"}), (a)-[:DEPENDS_ON]->(ac:Task {title:"AC"}) RETURN *;
替代方案:分多步查询
如果偏好分步操作,可拆为两个查询:
- 第一步创建所有节点:
CREATE (:Task {title:"A"}), (:Task {title:"AA"}), (:Task {title:"AB"}), (:Task {title:"AC"}) RETURN *;
- 第二步匹配节点并创建关系:
MATCH (a:Task {title:"A"}), (aa:Task {title:"AA"}), (ab:Task {title:"AB"}), (ac:Task {title:"AC"}) CREATE (a)-[:DEPENDS_ON]->(aa), (a)-[:DEPENDS_ON]->(ab), (a)-[:DEPENDS_ON]->(ac) RETURN *;
内容的提问来源于stack exchange,提问作者Valeriy
相关产品推荐
相关产品推荐

