改进密码查询并避免笛卡尔积

时间:2018-06-05 07:35:30

标签: neo4j cypher

我对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命令,它完全相同。有什么想改进那些代码吗?

1 个答案:

答案 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属性有一个唯一约束,那么就像您获得此标签一样快。然而,我最大的问题是......为什么不在创建交易本身时创建关系,而不是存储外键(图表数据库中的大数字,不存在)然后执行之后的工作?

希望这有帮助。

问候,汤姆