Cypher 加载 CSV 急切且操作持续时间长

2024-03-10

我正在加载一个包含 85K 行的文件 - 19M, 服务器有2个核心,14GB RAM,运行centos 7.1和oracle JDK 8 这可能需要5-10分钟使用以下服务器配置:

dbms.pagecache.memory=8g                  
cypher_parser_version=2.0  
wrapper.java.initmemory=4096  
wrapper.java.maxmemory=4096

磁盘挂载在 /etc/fstab 中:

UUID=fc21456b-afab-4ff0-9ead-fdb31c14151a /mnt/neodata            
ext4    defaults,noatime,barrier=0      1  2

将其添加到 /etc/security/limits.conf 中:

*                soft      memlock         unlimited
*                hard      memlock         unlimited
*                soft      nofile          40000
*                hard      nofile          40000

将其添加到 /etc/pam.d/su

session         required        pam_limits.so

将其添加到 /etc/sysctl.conf 中:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

通过运行禁用日志:

 sudo e2fsck /dev/sdc1
 sudo tune2fs /dev/sdc1
 sudo tune2fs -o journal_data_writeback /dev/sdc1
 sudo tune2fs -O ^has_journal /dev/sdc1
 sudo e2fsck -f /dev/sdc1
 sudo dumpe2fs /dev/sdc1

除此之外, 当运行探查器时,我得到很多“渴望”,我真的不明白为什么:

 PROFILE LOAD CSV WITH HEADERS FROM 'file:///home/csv10.csv' AS line
 FIELDTERMINATOR '|'
 WITH line limit 0
 MERGE (session :Session { wz_session:line.wz_session })
 MERGE (page :Page { page_key:line.domain+line.page }) 
   ON CREATE SET page.name=line.page, page.domain=line.domain, 
 page.protocol=line.protocol,page.file=line.file


Compiler CYPHER 2.3

Planner RULE

Runtime INTERPRETED

+---------------+------+---------+---------------------+--------------------------------------------------------+
| Operator      | Rows | DB Hits | Identifiers         | Other                                                  |
+---------------+------+---------+---------------------+--------------------------------------------------------+
| +EmptyResult  |    0 |       0 |                     |                                                        |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +UpdateGraph  |    9 |       9 | line, page, session | MergeNode; Add(line.domain,line.page); :Page(page_key) |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Eager        |    9 |       0 | line, session       |                                                        |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +UpdateGraph  |    9 |       9 | line, session       | MergeNode; line.wz_session; :Session(wz_session)       |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +ColumnFilter |    9 |       0 | line                | keep columns line                                      |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Filter       |    9 |       0 | anon[181], line     | anon[181]                                              |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Extract      |    9 |       0 | anon[181], line     | anon[181]                                              |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +LoadCSV      |    9 |       0 | line                |                                                        |
+---------------+------+---------+---------------------+--------------------------------------------------------+

所有标签和属性都有索引/约束 谢谢您的帮助 利奥尔


He Lior,

我们试图在这里解释一下预加载:

马克的原始博客文章在这里:http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/ http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

Rik 试图用更简单的术语来解释它:

http://blog.bruggen.com/2015/07/loading-belgian-corporate-registry-into_20.html http://blog.bruggen.com/2015/07/loading-belgian-corporate-registry-into_20.html

尝试理解“热切操作”

我之前读过这一点,但直到 Andres 再次向我解释时才真正理解它:在所有正常操作中,Cypher 都会延迟加载数据。例如,请参阅手册中的此页面 - 它基本上只是在执行操作时将尽可能少的内容加载到内存中。这种懒惰通常是一件好事。但它也会给你带来很多麻烦 - 正如迈克尔向我解释的那样:

“Cypher 试图履行不同操作的合同 一个声明内不会互相影响。否则你可能会 不确定的行为或无限循环。想象一个 像这样的声明:
MATCH (n:Foo) WHERE n.value > 100 CREATE (m:Foo {m.value = n.value + 100});

如果这两个陈述不是 隔离,那么 CREATE 生成的每个节点都会导致 MATCH 再次匹配等等,无限循环。这就是为什么在这种情况下,Cypher 急切地运行所有 MATCH 语句直至耗尽,以便所有 中间结果被累积并保存(在内存中)。

通常 对于大多数操作来说这不是问题,因为我们大多只匹配几个 最多十万个元素

使用 LOAD CSV 导入数据, 但是,此操作将拉入 CSV 的所有行(其中 可能是数百万),急切地执行所有操作(这可能是 数百万次创建/合并/匹配)并保留中间结果 结果存储在内存中以供后续操作使用。

这也是 有效地禁用 PERIODIC COMMIT 因为当我们到达末尾时 所有创建操作都已经执行的语句 发生了,巨大的德克萨斯州已经积累起来。”

这就是我的负载 csv 查询发生的情况。 MATCH/MERGE/CREATE 导致将急切的管道添加到执行计划中,并且它有效地禁用了“使用定期提交”的操作批处理。显然,即使使用看似简单的 LOAD CSV 语句,不少用户也会遇到此问题。很多时候你可以避免它,但有时你却无法避免。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cypher 加载 CSV 急切且操作持续时间长 的相关文章

  • Titan 顶点中心索引与 Neo4j 标签

    在接近这个问题时 我试图对这两种技术进行比较 我想知道你们中是否有人已经有处理其中任何一种或两种技术的经验 我主要对处理类似用例时的性能数字感兴趣 这两个概念之间的区别是全局索引和本地索引之间的区别 据我了解 Neo4j顶点标签允许您通过顶
  • 对于以双向关系连接的节点,cypher 返回两次

    我有 2 个节点 A B 通过 FRIEND 连接 当我运行以下命令时 start n node match n r FRIEND b return n name b name 它返回 2 行 A B 和 B A 我想知道如何让它只返回一条
  • 当属性名称为参数时如何查询属性值?

    通常我们可以查询属性值 例如 Match n Product where n name iPhone X return n 但是 就我而言 我不知道应该匹配哪个属性 但我只知道值 在这种情况下属性名称就变成了一种变量 我想要这样的东西 Ma
  • Python networkx 和持久性(可能在 neo4j 中)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个每秒在内存中创建数千个图形的应用程序 我希望找到一种方法来保存这些以供后续查询 它们并不是特别
  • SET 查询中“在此上下文中无效使用聚合函数”(Neo4j)

    我想知道为什么这被认为是 Neo4j 的 Cypher 中聚合函数的无效使用 MATCH p Project EMPLOYS n Person SET p youngest MIN n age 虽然以下被认为是有效的用例 MATCH p P
  • Neo4j:检索连接到 Neo4j Rest 中的节点或通过 Cypher 的所有节点和关系

    我想检索所有节点以及连接到节点的关系 我尝试通过两种方式做到这一点 1st通过Neo4j REST API http docs neo4j org chunked milestone server java rest client exam
  • “找不到类型的属性”组合存储库 spring-data-neo4j

    我在用着spring data neo4j我正在尝试组合存储库以便能够使用自定义存储库 我认为我已经正确遵循了中指定的命名约定20 8 7 创建存储库 http docs spring io spring data neo4j docs 3
  • 使用 py2neo 在 neo4j 上查询写入性能

    目前 我正在努力寻找一种高性能的方法 使用 py2neo 运行多个查询 我的问题是 python 中有一大堆需要写入 neo4j 的写入查询 我现在尝试了多种方法来解决这个问题 对我来说最好的工作方法如下 from py2neo impor
  • neo4j 在从 csv 导入期间指定数据类型

    有没有办法在导入时告诉neo4j值的类型 例如 neo4j 是否知道 2015 0104T10 33 44 是日期还是字符串 thanks Neo4j 使用 Java 原始类型 字符串或数组作为属性值 没有日期类型 所以 2015 0104
  • 使用 Neo4J 和 Spring Data 按 ID 创建关系

    我定义了一个简单的节点对象 如下所示 Node product public class Product Id private String sku Relationship type SOLD BY private Set
  • Neo4j 客户端使用“DateTime?”展开

    我目前正在尝试展开具有 日期时间 的 TravelEdges 列表 但我不断收到以下错误 CypherTypeException 类型不匹配 需要一个地图 但是字符串 2018 05 21T08 38 00 我目前正在使用最新版本的 neo
  • 如何删除neo4j中的所有索引?

    我想使用 cypher 批量删除所有存在的索引 可以吗 我正在使用 neo4j 3 4 7 DROP INDEX ON Label attributename 如果我在稍后阶段创建相同的索引 它会替换现有索引吗 删除所有索引和约束的快速方法
  • 使用cypher删除neo4j中的所有节点和关系超出堆空间

    我一直在尝试按照 neo4j google 组和其他在线来源的建议运行此查询 开始 n 节点 匹配 n r 其中 ID n gt 0 删除n r 为了删除测试之间的所有节点和关系 当我从控制台执行此操作时 我用完了 java 堆空间 当我从
  • Neo4j 入门

    我对 neo4j 完全陌生 很抱歉问这样一个基本问题 我已经安装了 neo4j 我正在使用 shell localhost 7474 webadmin console 我正在寻找一个很好的示例 它使用一些 shell 命令从预先存在的图形数
  • 使用 Cypher,如何返回仅包含其属性子集的节点

    假设我在 Neo4j 中创建了一个节点 CREATE Thing a foo b bar 我可以编写一个查询来获取该节点及其所有属性 MATCH n Thing a foo RETURN n 返回 a foo b bar 但是是否可以匹配一
  • 通过 awselb 使用 ssl 时的 neo4j java 驱动程序问题

    I am using neo4j community version 3 1 1 and enterprise edition version 3 0 1 with ssl configured through awselb To conn
  • 如何在neo4j中显示屏幕上的所有节点

    我有近 5000 个节点Recipes和 5 个节点Meal Types在 Neo4j 数据库中 目前他们之间没有任何关系 我正在下面运行 CQL MATCH n RETURN n LIMIT 100000 这运行良好 但它返回与相关的节点
  • 带子图聚合的递归查询(任意深度)

    我问了一个问题earlier https stackoverflow com questions 28036055 recursive query with sub graph aggreagation关于沿着图表聚合数量 提供的两个答案效
  • 参数映射不能用于 MERGE 模式

    我收到错误参数映射不能在合并模式中使用 我如何解决此错误 我正在使用下面的代码 我非常感谢任何帮助 提前致谢 MERGE u Person names RETURN u and data2 names name Keanu Reeves1
  • Neo4j - 根据关系属性查找两个节点之间的最短路径

    我试图弄清楚是否有某种方法可以根据关系总和获得两个节点之间的最短距离 给出以下示例 neo4j 图像示例 https i stack imgur com fiJe1 png 上图代码 CREATE some point 1 Point ti

随机推荐