【问题标题】:How to batch Neo4j Cypher queries如何批处理 Neo4j Cypher 查询
【发布时间】:2017-09-06 09:17:14
【问题描述】:

所以我有超过 130M 的一种类型的节点和 500K 的另一种类型的节点,我试图在它们之间创建如下关系:

MATCH (p:person)
MATCH (f:food) WHERE f.name=p.likes
CREATE (p)-[l:likes]->(f)

问题是创建了 1.3 亿个关系,我想在使用 LOAD CSV 时以与 PERIODIC COMMIT 类似的方式进行操作

我的查询类型有这样的功能吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    是的,有。您需要安装 APOC Procedures library (download here)。您将在Job Management 部分中使用 apoc.periodic.commit() 函数。来自文档:

    CALL apoc.periodic.commit(statement, params) - 重复批量更新 语句直到它返回 0,这个过程是阻塞的

    您将把它与 LIMIT 子句结合使用,将限制值作为参数传递。

    但是,为了获得最佳结果,您需要确保您的连接数据(我认为是 f.name)具有索引或唯一约束以大量减少时间。

    这是你可以如何使用它(从你的例子中假设一个人只喜欢一种食物,并且我们应该只将它应用于 :persons 尚未设置关系的人):

    CALL apoc.periodic.commit("
    MATCH (p:person)
    WHERE p.likes IS NOT NULL
    AND NOT (p)-[:likes]->(:food)
    WITH p LIMIT {limit}
    MATCH (f:food) WHERE p.likes = f.name
    CREATE (p)-[:likes]->(f)
    RETURN count(*)
    ", {limit: 10000})
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多