【发布时间】:2018-07-13 01:07:50
【问题描述】:
在看到this question 之后,我一直在阅读this blog post,了解在将非常大的CSV 加载到Neo4J 时需要避免Eager。
就我而言,我有大约 2700 万行 CSV,总大小约为 8.5 GB。将查询分解为几个查询以避免Eager 事务似乎非常重要。
EXPLAIN and PROFILE 都提供了“测试”查询的方法。在上面链接的 Mark Needham 的博客文章中,他提到:
您会注意到,当我们分析每个查询时,我们正在剥离 定期提交部分并添加“WITH row LIMIT 0”。这允许 我们生成足够的查询计划来识别“渴望” 操作符,而无需实际导入任何数据。
但是,当我尝试在带有 PROFILE 前缀的密码 shell 上测试我的查询时......什么也没有发生。我没有得到任何输出或报告。
$ ./bin/cypher-shell
Connected to Neo4j 3.3.5 at bolt://localhost:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.
neo4j> :begin
neo4j# PROFILE LOAD CSV WITH HEADERS FROM "file:///myfile.tsv" AS line FIELDTERMINATOR '\t'
WITH line LIMIT 0
MERGE ...
我也EXPLAIN 看到了同样的行为——没有报告或输出。
如果我将相同的 PROFILE ... 命令粘贴到 Neo4J Web 界面中,我确实会看到图形计划出现,甚至还有一个警告选项卡告诉我有关 EAGER 的信息。我想这总比没有好,但是通过这个图形显示很难阅读。我真的很想为此使用cypher-shell,但奇怪的是它没有显示任何内容。
我还尝试将EXPLAIN 或PROFILE 查询传递给cypher-shell,但这只是给了我一些元数据,而不是实际计划。
$ cat query.cypher | ./bin/cypher-shell --format plain
Plan: "EXPLAIN"
Statement: "READ_WRITE"
Version: "CYPHER 3.3"
Planner: "COST"
Runtime: "INTERPRETED"
Time: 155
简介:
$ cat query.cypher | ./bin/cypher-shell --format plain
Plan: "PROFILE"
Statement: "READ_WRITE"
Version: "CYPHER 3.3"
Planner: "COST"
Runtime: "INTERPRETED"
Time: 285
DbHits: 0
Rows: 1
count(*)
0
有什么想法吗?
【问题讨论】:
-
:begin打开一个事务,查询本身不会执行,直到您以:commit结束。在这种情况下,您可以完全放弃:begin,只需用分号结束查询。此外,由于您只是在此处执行查询计划,因此请使用 EXPLAIN,因此它不会实际执行查询。 -
@InverseFalcon 你能把你的评论作为答案吗?那我就可以接受了。 (谢谢)