【问题标题】:Improving cypher queries and avoiding cartesian product改进密码查询并避免笛卡尔积
【发布时间】: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 命令,它的作用完全相同。有什么想法可以改进该代码吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    如果可以的话,我想知道你为什么要分两步这样做

    MATCH (t:Transaction),(p1:Person),(p2:Person)
    WHERE p1.id = t.id1
    AND p2.id = t.id2
    CREATE (p1)-[:REL3]->(p2)
    

    如果您对 Person 标签的 id 属性有一个唯一约束,那么您将得到这个。然而,我最大的问题...为什么不在创建事务本身的那一刻创建关系,而不是存储 外键 (一个很大的不,在图形数据库中没有)然后做工作之后呢?

    希望这会有所帮助。

    问候,汤姆

    【讨论】:

    • 如果我理解正确,您会建议在我的LOAD CSV WITH HEADERS FROM "file:///transaction.csv"AS line 之后直接MATCH (p1:Person {id : line.id1}) , (p2:Person {id : line.id2})CREATE (p1)-[:rel3]->(p2) 吗?我试过了,它似乎很慢,不知道为什么......
    • @Aegir 确保您对 :Person(id) 有索引或唯一约束以使其快速运行
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2019-10-20
    • 2016-02-10
    相关资源
    最近更新 更多