检索单个节点的关系很慢

时间:2014-03-21 21:59:51

标签: neo4j

我开始使用Neo4J 2.0.1并且我已经遇到性能问题,这让我认为我的方法是错误的。到目前为止,我有一个单节点类型(所有标签都是NeoPerson)和一种关系类型(所有标签都是NeoWeight)。在我的测试设置中,大约有100,000个节点,每个节点与其他节点之间有0到300个关系。在NeoPerson的唯一字段中有一个Neo4j2.0样式的索引,称为profile_id(例如CREATE INDEX ON:NeoPerson(profile_id))。通过profile_id查找NeoPerson的速度相当快:

neo4j-sh (?)$ match (n:NeoPerson {profile_id:38}) return n;
+----------------------------+
| n                          |
+----------------------------+
| Node[23840]{profile_id:38} |
+----------------------------+
1 row
45 ms

然而,一旦我将关系投入到混合中,它就变得非常缓慢。

neo4j-sh (?)$ match (n:NeoPerson {profile_id:38})-[e:NeoWeight]->() return n, e;
+----------------------------------------------------------------------------+
| n                          | e                                             |
+----------------------------------------------------------------------------+
| Node[23840]{profile_id:38} | :NeoWeight[8178324]{value:384}               |
| Node[23840]{profile_id:38} | :NeoWeight[8022460]{value:502}               |
...
| Node[23840]{profile_id:38} | :NeoWeight[54914]{}                           |
+----------------------------------------------------------------------------+
244 rows
2409 ms

我的理解是,从单个节点遍历关系应该是非常有效的(不是使用图数据库的意义吗?),那么为什么在一个小的这样一个简单的查询上花费超过2秒数据集?我没有看到在关键字是源节点和/或目标节点的关系上添加索引的方法。

1 个答案:

答案 0 :(得分:0)

人们在生产中使用Neo4j没有问题。如果他们要求第一个用户查询必须在几毫秒内返回,他们会在服务器启动后预热缓存。例如。通过预先运行最重要的用例查询。

从磁盘加载节点和rels需要一些时间。 ESP。如果单个节点的关系(及其属性)分布在关系存储文件中并从旋转磁盘加载。

对于第一个查询,它还需要更长的时间,因为它的查询计划必须构建和编译。 这就是为什么在生产中你通常使用参数来允许查询缓存。

您尝试解决的用例是什么?