Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么neo4j中的相同加载csv在第二次运行时(在干净的数据库上)会花费指数级的时间?_Csv_Neo4j - Fatal编程技术网

为什么neo4j中的相同加载csv在第二次运行时(在干净的数据库上)会花费指数级的时间?

为什么neo4j中的相同加载csv在第二次运行时(在干净的数据库上)会花费指数级的时间?,csv,neo4j,Csv,Neo4j,我不熟悉使用Neo4j,所以我第一次尝试加载数据库是一次学习实验。我意识到当我尝试一些我想做的查询时,我没有创建正确的模型。我使用:rm-rf data/*从命令行中清除了数据库,并在停止数据库并启动之后重新启动。前3次加载与我第一次导入数据时几乎完全相同 USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS from 'file' AS line WITH line MERGE (p:Provider {pid:line.pid}); USING

我不熟悉使用Neo4j,所以我第一次尝试加载数据库是一次学习实验。我意识到当我尝试一些我想做的查询时,我没有创建正确的模型。我使用:rm-rf data/*从命令行中清除了数据库,并在停止数据库并启动之后重新启动。前3次加载与我第一次导入数据时几乎完全相同

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MERGE (p:Provider {pid:line.pid});

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MERGE (c:Credential {name:credential});

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MATCH (p:Provider {pid:line.pid});
MATCH (c:Credential {name:credential});
MATCH (p)-[:IS_A]->(c);
第二次运行这些load语句时,唯一的区别是第一个节点有两个标签:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MERGE (p:Provider:Person {pid:line.pid});

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MERGE (c:Credential {name:credential});

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MATCH (p:Person {pid:line.pid});
MATCH (c:Credential {name:credential});
MATCH (p)-[:IS_A]->(c);

第一次运行这3个导入时,可能需要20分钟。然而,第二次,它已经运行了3天。前两次装载仍然很快,每次大约5分钟。从那以后,这种关系一直在运行。我不明白为什么要花这么长时间。

你有关于属性的索引吗

CREATE INDEX ON :Person(pid)
CREATE INDEX ON :Credential(name)
或者,如果希望在列上强制唯一性,则应创建约束,这也会创建索引:

CREATE CONSTRAINT ON (n:Person) ASSERT n.pid IS UNIQUE
CREATE CONSTRAINT ON (n:Credential) ASSERT n.name IS UNIQUE
  另外,我认为您的最后一个匹配应该是合并,并且您不应该使用分号:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS from 'file' AS line
WITH line
MATCH
  (p:Person {pid:line.pid}),
  (c:Credential {name:credential})
MERGE (p)-[:IS_A]->(c);

我已经设置了唯一性约束。对于Person,我只使用了n:Provider ASSERT n.pid上的CREATE约束是唯一的,我是否也需要为Person标签这样做,即在n:Person ASSERT n.pid上创建约束是唯一的?对于最后一个匹配,您是对的,假设它是一个合并。这是一个复制错误。我认为添加Person约束或索引将对PerformanceGraat有很大帮助。谢谢!我想就是这样。我只需要为每个标签设置一个索引/唯一性约束。在上次加载时,我复制了错误的代码。它应该是:使用周期提交1000加载CSV,其中标题来自“文件”,作为行匹配p:Person{pid:line.pid}匹配c:Credential{name:Credential}合并p-[:IS_A]->c;