当前位置: 首页 > 知识库问答 >
问题:

Neo4j加载CSV应用程序线程阻塞

南宫俊逸
2023-03-14

我试图使用neo4j中的load CSV命令从CSV文件中导入大约500,000行数据。

Artists    |    Feature1    |    Feature2    |    Feature3

下面是我正在使用的代码:

CREATE CONSTRAINT ON (a:Artist) ASSERT a.artistName IS UNIQUE;

USING PERIODIC COMMIT 50
LOAD CSV WITH HEADERS from 'https://aws.bigfile.csv' as line
MERGE (artist:Artist {artistName: line.Artist})
MERGE (feature1:Artist {artistName: line.Feature1})
MERGE (feature2:Artist {artistName: line.Feature2})
MERGE (feature3:Artist {artistName: line.Feature3})

MERGE (artist)-[f1:FEATURES]->(feature1) 
ON CREATE SET f1.strength = 1
ON MATCH SET f1.strength = f1.strength + 1

MERGE (artist)-[f2:FEATURES]->(feature2) 
ON CREATE SET f2.strength = 1
ON MATCH SET f2.strength = f2.strength + 1

MERGE (artist)-[f3:FEATURES]->(feature3) 
ON CREATE SET f3.strength = 1
ON MATCH SET f3.strength = f3.strength + 1

期望的行为:第一次出现以另一个艺术家为特征的人会创建features关系,并且应该将features关系的strength属性设置为1。对于随后的每一次事件,强度属性将增加1。因此,经常以艺术家B为特色的艺术家A应该具有类似(A)-[:features{strongth:AHighNumber]->(B)的关系

关系是方向性的,在这种情况下,方向性很重要(A以B为特征不同于B以A为特征)。

2017-12-30 10:54:04.268+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 467ms.

在确定问题时,是否有其他有用的信息?你知道我该如何重组我的代码来避免这个问题吗?非常感谢所有的帮助。谢了!

共有1个答案

鲁明知
2023-03-14

如果您将查询粘贴到浏览器中(不运行它,只粘贴它),您将在浏览器旁边得到一个警告,当扩展时,该警告如下:

此查询的执行计划包含Eager运算符,该运算符强制所有相关数据在继续之前在主存中具体化。在执行计划包含Eager运算符的查询中,对大型数据集使用LOAD CSV可能会消耗大量内存,并且可能执行不佳。有关如何避免问题的更多信息和提示,请参见Eager操作符上的Neo4j手册条目。

这就解释了为什么您会看到性能问题...它有效地取消了定期提交的任何使用。

当在同一个节点标签上有多个合并时,可以在查询计划中获得eager操作。解决这类问题的一般方法是只在CSV中的单个变量中合并节点:

USING PERIODIC COMMIT 50
LOAD CSV WITH HEADERS from 'https://aws.bigfile.csv' as line
MERGE (artist:Artist {artistName: line.Artist})

如果CSV中的line.artist有所有可能的艺术家,那么应该只传递一次。但是,如果在line.feature1中有其他艺术家(以及其他艺术家),而不在line.artist中,那么您需要依次为每一个进行另一次传递,直到所有节点加载完毕(您还可以将定期提交推到5000到10000左右)。

请注意,您对多个节点的同一关系类型的多次合并也有助于EAGER操作。您真的应该看看是否可以以不同的格式获得CSV。您实际上并不需要所有这些额外的列,line.artistline.Feature就足够了,然后您将拥有多个具有相同艺术家和不同特性的行,您就不会被急切的操作所困扰。

为了避免急切的操作并允许使用定期提交,您的替代方案是用3次传递执行查询(在导入所有节点之后):

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS from 'https://aws.bigfile.csv' as line
match (artist:Artist {artistName: line.Artist})
match (feature:Artist {artistName: line.Feature1})

MERGE (artist)-[f:FEATURES]->(feature1) 
ON CREATE SET f.strength = 1
ON MATCH SET f.strength = f.strength + 1

然后对line.feature2line.feature3重复but。

 类似资料:
  • 这是我的第一个问题。我一路寻找,尝试了很多,但没有得到我想做的。问题是:我有一个应用程序使用SoundPool播放声音,仅此而已。但是要加载的东西很多(>50),一个一个加载需要时间。看一看; @Override公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){View V

  • 我正在制作一个Android应用程序,应该连接到Arduino HC-06模块。 我查看了Android文档,并试图让它与提供的代码一起工作。 然而,当我试图在我的三星A32 5G上运行代码时,所有视图都无法加载(空白屏幕),连接没有建立,我从logcat得到以下输出: 如果您需要任何其他代码片段,我可以提供他们,如果这个问题是重复的(我无法找到任何类似的问题),只要写一个注释与链接,我会删除它。

  • 我尝试使用load CSV with headers命令将以下节点加载到Neo4j中: 我将Excel-Sheet保存为: 所以有6个节点(就像我有6行一样),但它们都没有任何属性 我已经尝试用不同的分隔符保存文件,或者手动添加引号。后者给出: PS:我在stackoverflow上阅读了关于这个主题的所有其他帖子,但没有一个能帮我解决这个问题 给予:

  • 我不确定为什么所有的线程都被阻塞了。我以为类只加载一次,以后就不需要带任何锁了。