2013-10-22 124 views
1

我有一个带有7340个节点的Neo4j数据库。每个节点都有一个标签(肿瘤)和2个属性(conceptID和fullySpecifiedName)。在两个属性上都启用了Autoindexing,并且我已经在肿瘤上创建了一个模式索引:conceptID和neoplasm:fullySpecifiedName。节点是术语树中的概念。有一个单独的根节点,其他节点经常通过多条路径下至多达13层的深度。从SQL Server实现,层次结构如下...Neo4j数据库添加关系非常缓慢

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这contructs并执行这样一个暗号查询添加关系...

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个。即使随着关系数量的增加,速度也不会进一步下降,但需要三天时间才能添加剩余的数量!

任何人都可以提出为什么这个表现如此糟糕?或者这种性质的写作表现是正常的,而且它只是读取性能非常好。一个样本Cypher查询返回一个5级节点的父母返回一个23个fullySpecifiedName属性列表,比我用秒表可以测量的时间少! (远低于一秒)。

+0

你有一个索引:肿瘤(conceptId)?遍历很便宜,但通过id查找仍然需要索引等方法。 –

+0

要验证该指数是真正使用您可以张贴在 “PROFILE MATCH(儿:肿瘤),(家长:肿瘤) WHERE child.conceptID = ”打印查询计划448257000“ AND parent.conceptID =” 372095001" CREATE孩子 - [:ISA] - >父母“在shell中执行? –

回答

1

你说你正在使用autoindexing。但是,您的查询将使用模式索引而不是自动索引。自动索引基于属性的索引节点,不受限于标签。模式索引是Neo4j 2.0的一个新的令人惊叹的功能。

因此摆脱autoindexes和作为泰胜建议,使用创建的模式索引:

CREATE INDEX ON :neoplasm(conceptId) 

即使结构中索引将关系会越来越慢作为图形的增长,因为指数通常会在数标度(N)水平。然而,它应该比你观察的时间快得多。

+0

实际上,重读他原来的问题,他说:“我已经创建了肿瘤模式索引:conceptID和肿瘤:fullySpecifiedName”。关键名称是否区分大小写?如果是这样,问题可能是conceptId vs conceptID。 –

+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输出以获得更好的洞察力。

+0

我刚刚在浏览器控制台中试过。 –

+0

而且?有什么改变?任何输出? –

+0

第一次错误是'Unrecognized:PROFILE MATCH ....',所以我省略了PROFILE关键字,然后错误是'Invalid input'S':expected'n/N'(line 3,column 2) “USING INDEX儿童:肿瘤(概念ID)“ ^'。 neo4jclinet中'USING'语句的语法是什么,以及如何使用'PROFILE'关键字? –

0

我似乎找到了答案。我重新启动了Neop4j数据库(Neop4j 2.0.0-M06),并且得到了Neo4j的常用信息将在几秒钟内准备就绪。半小时后,地位变绿了。在那段时间里,我正在监视这个过程,它似乎正在重建lucene索引。

我已经尝试加载更多的关系,他们现在被添加在一个可接受的速度(约100毫秒每关系)。

感谢您的意见

+0

不错!另外,当您使用批处理引入器时,Neo4j必须在暴发户时建立Label Scan lucene存储库。导入Musicbrainz时有相同的效果,需要一些时间。也许将该操作放入batchinserter会更好。 –