我对neo4j和cypher很新。我有一个表Transaction和一个表我想链接的人如下(只有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
命令,它完全相同。有什么想改进那些代码吗?
答案 0 :(得分:0)
我想知道为什么你能分两步完成这项工作
MATCH (t:Transaction),(p1:Person),(p2:Person)
WHERE p1.id = t.id1
AND p2.id = t.id2
CREATE (p1)-[:REL3]->(p2)
如果您对Person标签的id属性有一个唯一约束,那么就像您获得此标签一样快。然而,我最大的问题是......为什么不在创建交易本身时创建关系,而不是存储外键(图表数据库中的大数字,不存在)然后执行之后的工作?
希望这有帮助。
问候,汤姆