我是Neo4j的新手,并且很少有4M节点和10M关系的图形查询。直到现在我对我的查询表现完全感到惊讶。
SCHEMA
.......
(a:user{data:1})-[:follow]->(:user)-[:next*1..10]-(:activity)
此处有数据的用户:1跟随另一个100,000用户。这100,000个用户中的每一个都有2-8个下一个节点(比如用户的活动)。现在我想将用户的活动提取到下一级别3 [:next * 1..3]。每项活动都有财产相关编号。
所以现在我有100,000 * 3个节点要遍历。
CYPHER
.......
match (u:user{data:1})-[:follow]-(:user)-[:next*1..3]-(a:activity)
return a order by a.relevance desc limit 50
此查询几乎每次都需要72000毫秒。由于我是Neo4j的新手,我确信我还没有完成操作系统的调整。
我正在使用以下参数 -
wrapper.java.initmemory = 2000
wrapper.java.maxmemory = 2456
neostore.nodestore.db.mapped_memory = 25M neostore.relationshipstore.db.mapped_memory = 50M neostore.propertystore.db.mapped_memory = 90M neostore.propertystore.db.strings.mapped_memory = 130M neostore.propertystore.db.arrays.mapped_memory = 130M
请告诉我我做错了什么。我阅读了neo4j网站上的所有文档,但查询时间没有改善。
请告诉我如何配置高性能缓存?我应该怎么做才能将所有图形加载到内存中?当我看到我的RAM使用情况时,它总是像4 Gb中的1.8 GB。我在Windows上使用企业许可证(Neo4j 2.0)。请帮忙。
答案 0 :(得分:1)
你实际上不是100k * 3,而是100k *(2-10)^ 10意味着10 ^ 15路径。
你机器中的更多内存会很有意义,所以尝试获得8或更多GB。
然后你可以增加堆,例如到6GB:
wrapper.java.initmemory=6000
wrapper.java.maxmemory=6000
neostore.nodestore.db.mapped_memory=100M
neostore.relationshipstore.db.mapped_memory=500M
neostore.propertystore.db.mapped_memory=200M
neostore.propertystore.db.strings.mapped_memory=200M
neostore.propertystore.db.arrays.mapped_memory=10M
如果您想提取数据,则很可能想要反转您的查询。
match (a:activity),(u:user{data:1})
with a,u
order by a.relevance
desc limit 100
match (followed:user)-[:next*1..3]-(a:activity)
where (followed)-[:follow]-(user)
return a
order by a.relevance
desc limit 50