我开始使用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秒数据集?我没有看到在关键字是源节点和/或目标节点的关系上添加索引的方法。
答案 0 :(得分:0)
人们在生产中使用Neo4j没有问题。如果他们要求第一个用户查询必须在几毫秒内返回,他们会在服务器启动后预热缓存。例如。通过预先运行最重要的用例查询。
从磁盘加载节点和rels需要一些时间。 ESP。如果单个节点的关系(及其属性)分布在关系存储文件中并从旋转磁盘加载。
对于第一个查询,它还需要更长的时间,因为它的查询计划必须构建和编译。 这就是为什么在生产中你通常使用参数来允许查询缓存。
您尝试解决的用例是什么?