【发布时间】:2018-06-05 07:35:29
【问题描述】:
我对 neo4j 和 cypher 还是很陌生。我有一个表 Transaction 和一个表 Person 我想链接如下(只有 rel3 关系最后才重要):
MATCH (t:Transaction),(p1:Person)
WHERE p1.id = t.id1
CREATE (p1)-[:rel1]->(t)
MATCH (t:Transaction),(p2:Person)
WHERE p2.id = t.id2
CREATE (t)-[:rel2]->(p2)
MATCH (p1:Person)-[:rel1]->(t:Transaction)-[:rel2]->(p2:Person)
CREATE (p1)-[:rel3]->(p2)
但是我想知道是否有办法避免这种双笛卡尔积并仍然实现相同的目标。性能对我来说确实是一个大问题,因为我要处理数百万行。所以我尝试了一些修改并最终得到了那个版本:
MATCH (t:Transaction)
WITH t
MATCH (p1:Person {id : t.id1})
WITH n1, t
MATCH (p2:Person {id : t.id2})
CREATE (p1)-[:rel3]->(p2)
它更易于阅读和理解,但根据PROFILE 命令,它的作用完全相同。有什么想法可以改进该代码吗?
【问题讨论】: