1

所以我正在生成一个相当大的 Neo4J 实例,我正在使用 LOAD_CSV 加载它。我已经阅读了尽可能多的关于优化查询以从查询计划中删除 Eager 读取的博客,但是我遇到了一个我无法解释的示例。

假设我们有两种类型的节点,A 和 B。每一种都有一个唯一的属性,名称,并对其有一个约束:

CREATE CONSTRAINT ON (a:A) ASSERT a.name IS UNIQUE
CREATE CONSTRAINT ON (b:B) ASSERT b.name IS UNIQUE

现在,如果我们希望在任一类型的节点之间创建关系,如下所示:

MERGE (a:A {name:1})
MERGE (b:B {name:2})
MERGE (a)-[:REL]->(b)

我们的查询计划完全没有急于求成。

但是,如果我们想在 2 个相同类型的节点之间创建关系:

MERGE (a:A {name:1})
MERGE (b:A {name:2})
MERGE (a)-[:REL]->(b)

个人资料回来了,里面有热切的阅读!

我们可以通过将两个节点合并更改为匹配来消除这种渴望,但这为我们打开了不创建我们想要创建的关系的可能性!

我的问题是为什么会发生这种在同一标签的两个节点之间创建关系的特定情况?

我在 Neo 2.3.2 上发现了这一点。

4

2 回答 2

3

这是预期的行为,MERGE原样MATCHCREATE

因此,如果您在同一个标​​签上合并,第一个 MERGE将创建第二个 MERGE需要看到才能正常工作的节点。这就是为什么第一个变成了一个急切的操作。

通常,当前面的操作修改图形以使后续的 MATCH 操作受其影响时,就会发生急切。

它与您的关系创建完全无关,即没有关系也会发生MERGE

通常,将这些操作分成多个通道是有帮助的。

然后,您还可以最小化每个操作必须考虑的行数以及索引查找的数量。

WITH distinct row.column as col 
MERGE (:Lable {id:col}) ...
于 2016-03-17T04:16:09.207 回答
1

一个潜在的解决方法:处理 csv 文件 3 次:

  1. LOAD CSV WITH HEADERS FROM <whateverurl> AS line MERGE (a:A {name:line.column1})
  2. LOAD CSV WITH HEADERS FROM <whateverurl> AS line MERGE (a:A {name:line.column2})
  3. LOAD CSV WITH HEADERS FROM <whateverurl> AS line MATCH (a:A {name:line.column1}) MATCH (b:A {name:line.column2}) MERGE (a)-[:REL]->(b)

这应该是“渴望自由”的。

于 2016-03-16T20:38:13.343 回答