Neo4j数据库添加关系的速度非常慢

Neo4j数据库添加关系的速度非常慢,neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我有一个拥有7340个节点的Neo4j数据库。每个节点有一个标签(肿瘤)和两个属性(conceptID和fullySpecifiedName)。在这两个属性上都启用了自动索引,并且我已经在Neumbo:conceptID和Neumbo:FullysSpecifiedName上创建了一个架构索引。节点是术语树中的概念。只有一个根节点,其他根节点通常通过多条路径下降到13层的深度。在SQL Server实现中,层次结构如下所示 Depth Relationship Count 0 1 1

我有一个拥有7340个节点的Neo4j数据库。每个节点有一个标签(肿瘤)和两个属性(conceptID和fullySpecifiedName)。在这两个属性上都启用了自动索引,并且我已经在Neumbo:conceptID和Neumbo:FullysSpecifiedName上创建了一个架构索引。节点是术语树中的概念。只有一个根节点,其他根节点通常通过多条路径下降到13层的深度。在SQL Server实现中,层次结构如下所示

Depth Relationship Count
0     1
1     37
2     360
3     1598
4     3825
5     6406
6     7967
7     7047
8     4687
9     2271
10    825
11    258
12    77
13    3
我使用一个C#程序和neo4jclient来添加关系,neo4jclient构造并执行像这样的密码查询

MATCH (child:neoplasm), (parent:neoplasm)
WHERE child.conceptID = "448257000"   AND parent.conceptID="372095001"   
CREATE child-[:ISA]->parent
将关系添加到第3级非常快,第4级本身也不错,但在第5级,事情开始变得非常缓慢,平均每段关系超过9秒

上面的示例查询是通过
http://localhost:7474/browser/
接口,耗时12917ms,因此执行时间差不是C#代码或neo4jclient API的特点

我认为图形数据库的速度应该非常快,而且性能与大小无关

到目前为止,在35362段感情中,我只增加了9033段。即使速度不会随着关系数量的增加而进一步降低,也需要三天的时间来添加剩余的关系


有人能解释一下为什么这场演出如此糟糕吗?或者说,这种性质的写性能正常吗?只有读性能好。用于返回级别5节点的父节点的示例Cypher查询将在比秒表更短的时间内返回包含23个完整指定名称属性的列表!(不到一秒钟)。

你说你在使用自动索引。但是,查询将使用架构索引而不是自动索引。自动索引基于属性的索引节点,并且不绑定到标签。 模式索引是Neo4j 2.0的一个新特性

因此,请摆脱自动索引,并按照Tatham的建议,使用以下方法创建模式索引:

CREATE INDEX ON :neoplasm(conceptId)

即使使用模式索引,随着图形的增长,插入关系的速度也会变慢,因为索引通常在日志(n)级别进行缩放。但是,它应该比您观察到的时间快得多。

当同时在标签上使用不同的索引时,Cypher(尚未)选择这些索引来加快查询速度,而是尝试给出使用它们的提示,请参阅


这能改善情况吗?另外,为了更好地了解情况,请发布配置文件输出。

我似乎已经找到了答案。我重新启动了Neo4j数据库(Neo4j 2.0.0-M06),并得到了Neo4j将在几秒钟内准备就绪的常见消息。半个多小时后,状态变为绿色。在那段时间里,我一直在监控这个过程,它似乎正在重建lucene索引

此后,我尝试加载更多关系,现在它们以可接受的速率(每个关系约100毫秒)添加


感谢您的评论

您有关于肿瘤(概念ID)的索引吗?遍历很便宜,但按id查找仍然需要索引之类的方法。为了验证索引是否真的被使用,您可以在shell中执行“PROFILE MATCH(child:neuroma),(parent:neuroma)WHERE child.conceptID=“448257000”和parent.conceptID=“372095001”CREATE child-[:ISA]>parent”时发布打印的查询计划吗?实际上,重新阅读他的原始问题,他说,“我已经创建了一个关于肿瘤的模式索引:概念ID和肿瘤:完整指定名称”。密钥名称区分大小写吗?如果是这样的话,问题可能是conceptId和conceptId。密钥名称对我的知识是区分大小写的。以及?有什么变化吗?有输出吗?第一次错误是
无法识别:PROFILE MATCH…
所以我省略了PROFILE关键字,然后错误是
无效的输入'S':预期为'n/n'(第3行,第2列)“使用索引子对象:Neuroma(conceptID)”^
。neo4jclinet中使用语句的
语法是什么,以及如何使用
PROFILE
关键字?找到了这两个问题的答案。配置文件在浏览器窗口(以及WebAdmin页面的数据浏览器)中不受支持,但在WebAdmin.Console中有效。USING子句需要在匹配之后和WHERE之前,而不是像示例中那样在WHERE之后。很好!此外,当您使用batchinserter时,Neo4j必须在upstart上建立标签扫描lucene存储。前几天导入Musicbrainz时产生了相同的效果,需要一些时间。也许将该操作放入batchinserter会更好。
PROFILE
MATCH (child:neoplasm), (parent:neoplasm)
WHERE child.conceptID = "448257000"   AND parent.conceptID="372095001"   
USING INDEX child:neoplasm(conceptID)
USING INDEX parent:neoplasm(conceptID)
CREATE child-[:ISA]->parent