在密码中创建大量节点之间的关系

时间:2015-03-02 08:05:58

标签: neo4j cypher

鉴于此问题的下图:Cypher 2 not using schema index with OR operator

CREATE 
(:Application {Name: "Test Application", Aliases: ["Test", "App", "TestProject"]}),
(:Application {Name: "Another Application", Aliases: ["A-App", "XYZ", "XYProject"]}),
(:Application {Name: "Database X", Aliases: ["DB-App", "DB", "DB-Project"]}),
(:System {Name: "Server1", Application: "TestProject"}),
(:System {Name: "Server2", Application: "Test Application"}),
(:System {Name: "Server3", Application: "another App"}),
(:System {Name: "Server4", Application: "Some Database"}),
(:System {Name: "Server5", Application: "App"}),
(:System {Name: "Server6", Application: "App XY"}),
(:System {Name: "Server7", Application: "App DB"}),
(:System {Name: "Server8", Application: "Test"}),
(:System {Name: "Server9", Application: "TestProject"}),
(:System {Name: "Server10", Application: "test"}),
(:System {Name: "Server11", Application: "App XY"});

CREATE INDEX ON :Application(Name);
CREATE INDEX ON :Application(Aliases);

CREATE INDEX ON :System(Application);

但有900 Application和200.000 System个节点。

我向其中一个应用程序添加了一个新别名(例如“Test MiniApp”)(最终将匹配生产数据库中的〜27.000个新System个节点)并运行以下查询:

MATCH (a:Application { Name: "Test Application"})
WITH a
MATCH (s:System)
WHERE s.Application IN (a.Aliases + a.Name)
AND NOT (a)-[:InstalledOn]->(s)
CREATE UNIQUE (a)-[:InstalledOn]->(s)

此查询使用生产数据库上的模式索引(使用PROFILE测试),但运行时间太长,约5分钟。我想知道为什么要为索引找到的~27k节点创建关系需要这么长时间。

Neo4j 2.1.6使用96 GB RAM在Linux系统(SLES 11)上使用默认设置运行。

修改 上述查询只返回类型Application的单个节点,并且仅在重命名应用程序和/或添加/删除别名时执行。由于两个实体在任何时候都来自外部系统,我不仅可以使用新系统可以直接与应用程序相关的情况,因为它可能在导入时间期间不存在。因此,当有人向应用程序添加新的别名等时,我需要找到所有匹配的系统并创建该关系。

1 个答案:

答案 0 :(得分:0)

NOT (a)-[:InstalledOn]->(s)子句中的WHERE检查不一定是必要的,因为CREATE UNIQUE (a)-[:InstalledOn]->(s)会自动为您执行相同的检查。基本上,你要做两次同样的检查。

这会加速吗?

MATCH (a:Application { Name: "Test Application"}), (s:System)
WHERE s.Application IN (a.Aliases + a.Name)
CREATE UNIQUE (a)-[:InstalledOn]->(s)