Neo4j数据库添加关系很慢

时间:2013-10-22 09:53:12

标签: neo4j cypher neo4jclient

我有一个包含7340个节点的Neo4j数据库。每个节点都有一个标签(neoplasm)和2个属性(conceptID和fullySpecifiedName)。在两个属性上都启用了自动索引,我在neoplasm上创建了一个模式索引:conceptID和neoplasm:fullySpecifiedName。节点是术语树中的概念。有一个根节点,其他根节点经常通过几条路径下降到最多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添加关系,它构造并执行像这样的密码查询......

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个fullySpecifiedName属性的列表,其时间少于我用秒表测量的时间! (一秒钟之内)。

3 个答案:

答案 0 :(得分:2)

在标签上同时使用不同的索引时,Cypher(尚未)选择这些索引以加快查询速度,而是尝试提供使用它们的提示,请参阅http://docs.neo4j.org/chunked/milestone/query-using.html#using-query-using-multiple-index-hints

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

这会改善一些事情吗?另外,请发布PROFILE输出以获得更好的洞察力。

答案 1 :(得分:1)

你说你正在使用自动索引。但是,您的查询将使用架构索引而不是自动索引。根据属性自动索引索引节点,并且不与标签绑定。 模式索引是Neo4j 2.0的一个新功能。

所以摆脱自动索引,正如Tatham建议的那样,使用:

创建模式索引
CREATE INDEX ON :neoplasm(conceptId)

即使使用模式索引,随着图形的增长,插入关系也会变慢,因为索引通常会在log(n)级别进行扩展。然而,它应该比您观察到的时间快得多。

答案 2 :(得分:0)

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

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

感谢您的评论