如何批处理Neo4j密码查询

如何批处理Neo4j密码查询,neo4j,cypher,Neo4j,Cypher,因此,我有超过130M的一种类型的节点和500K的另一种类型的节点,我试图在它们之间建立如下关系: MATCH (p:person) MATCH (f:food) WHERE f.name=p.likes CREATE (p)-[l:likes]->(f) 问题是创建了1.3亿个关系,我希望在使用LOAD CSV 我的查询类型有这样的功能吗?是的,有。您将需要安装()。在本节中,您将使用apoc.periodic.commit()函数。从文件中: 调用apoc.periodic.comm

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

MATCH (p:person)
MATCH (f:food) WHERE f.name=p.likes
CREATE (p)-[l:likes]->(f)
问题是创建了1.3亿个关系,我希望在使用
LOAD CSV


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

是的,有。您将需要安装()。在本节中,您将使用apoc.periodic.commit()函数。从文件中:

调用apoc.periodic.commit(语句,参数)-重复批处理更新 语句,直到返回0为止,此过程处于阻塞状态

您将结合使用LIMIT子句,将LIMIT值作为参数传递

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

下面是您可以使用它的方式(从您的示例中假设一个人只喜欢一种食物,并且我们应该只将此应用于:尚未建立关系的人):

这里有一个更新,它得到了发展和改进,批处理能力也得到了改进。实际上,在所有情况下,都应该使用[apoc.periodic.iterate()[(),因为它更高效、更易于使用。使用它时更难犯愚蠢的错误。
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})