在 Neo4J 中加载大密码文件
Loading large cypher file in Neo4J
我在 Windows10 中将 Cypher 文件加载到 Neo4J 时遇到一些困难。有问题的文件是一个 175 Mb 的 .cql 文件,其中包含超过一百万行节点和边缘(由Cypher 语言中的分号)-- CREATE [节点],诸如此类。对于较小的项目,我一直在网络浏览器中使用 APOC 命令:
call apoc.cypher.runFile('file:///<file path>')
但这对于超过一百万个查询文件来说太慢了。我已经为节点创建了索引,目前正在通过命令 运行 它:
neo4j-shell -file <file path> -path localhost
但这仍然很慢。请问有什么办法可以加快摄入速度吗?
另外请注意,我使用的是最近的 ONGDB 版本,而不是直接的 Neo4J;我不认为这会产生任何实质性的变化。
如果您的非常大的 CQL 文件的目的只是为了摄取数据,那么纯粹在 Cypher 中执行它会非常慢(甚至可能导致内存不足错误)。
如果您正在摄取新的 neo4j 数据库,您应该考虑从中重构数据并使用 import command of neo4j-admin 工具有效地摄取数据。
如果要摄取到现有数据库中,则应考虑重构 CQL 文件中的数据和逻辑并使用 LOAD CSV.
我最终使用 cypher-shell 摄取了它。它仍然很慢,但至少它确实完成了。使用它需要首先打开 Neo4J 控制台,然后在第二个命令行中使用:
type <filepath>\data.cql | bin\cypher-shell.bat -a localhost -u <user> -p <password> --fail-at-end
这适用于 Windows 10,尽管确实需要一段时间。
当 运行 在事务之外进行查询时,neo4j will automatically start and commit a separate transaction for every query。您可以通过在开始时启动一个事务,每隔几千个查询提交并启动一个新事务来加快速度(内存使用会随着事务大小而增加,因此这是事务大小的限制因素)。
示例queries.cypher(交易规模为 3):
:begin
CREATE(n:PERSON { name: "Homer Simpson" })
CREATE(n:PERSON { name: "Marge Simpson" })
CREATE(n:PERSON { name: "Abe Simpson" })
:commit
:begin
CREATE(n:PERSON { name: "Bart Simpson" })
CREATE(n:PERSON { name: "Lisa Simpson" })
CREATE(n:PERSON { name: "Maggie Simpson" })
:commit
然后像往常一样运行cypher-shell < queries.cypher
。
我在 Windows10 中将 Cypher 文件加载到 Neo4J 时遇到一些困难。有问题的文件是一个 175 Mb 的 .cql 文件,其中包含超过一百万行节点和边缘(由Cypher 语言中的分号)-- CREATE [节点],诸如此类。对于较小的项目,我一直在网络浏览器中使用 APOC 命令:
call apoc.cypher.runFile('file:///<file path>')
但这对于超过一百万个查询文件来说太慢了。我已经为节点创建了索引,目前正在通过命令 运行 它:
neo4j-shell -file <file path> -path localhost
但这仍然很慢。请问有什么办法可以加快摄入速度吗?
另外请注意,我使用的是最近的 ONGDB 版本,而不是直接的 Neo4J;我不认为这会产生任何实质性的变化。
如果您的非常大的 CQL 文件的目的只是为了摄取数据,那么纯粹在 Cypher 中执行它会非常慢(甚至可能导致内存不足错误)。
如果您正在摄取新的 neo4j 数据库,您应该考虑从中重构数据并使用 import command of neo4j-admin 工具有效地摄取数据。
如果要摄取到现有数据库中,则应考虑重构 CQL 文件中的数据和逻辑并使用 LOAD CSV.
我最终使用 cypher-shell 摄取了它。它仍然很慢,但至少它确实完成了。使用它需要首先打开 Neo4J 控制台,然后在第二个命令行中使用:
type <filepath>\data.cql | bin\cypher-shell.bat -a localhost -u <user> -p <password> --fail-at-end
这适用于 Windows 10,尽管确实需要一段时间。
当 运行 在事务之外进行查询时,neo4j will automatically start and commit a separate transaction for every query。您可以通过在开始时启动一个事务,每隔几千个查询提交并启动一个新事务来加快速度(内存使用会随着事务大小而增加,因此这是事务大小的限制因素)。
示例queries.cypher(交易规模为 3):
:begin
CREATE(n:PERSON { name: "Homer Simpson" })
CREATE(n:PERSON { name: "Marge Simpson" })
CREATE(n:PERSON { name: "Abe Simpson" })
:commit
:begin
CREATE(n:PERSON { name: "Bart Simpson" })
CREATE(n:PERSON { name: "Lisa Simpson" })
CREATE(n:PERSON { name: "Maggie Simpson" })
:commit
然后像往常一样运行cypher-shell < queries.cypher
。