需要帮助减少大关系数据集的neo4j查询延迟问题。
系统配置 云上的8核,32 GB VM
Neo4J配置 页面缓存 - 20 GB 堆 - 8 GB
ObjectModel 节点与关系属性“timestamp”共享“COMMUNICATING_TO”关系。
查询 找到给定时间段内节点之间的所有通信,删除两个给定节点之间的重复通信。
MATCH (n1)-[r:COMMUNICATING_TO]->(n2)
WHERE r.timestamp >= <fromTimestamp> AND r.timestamp <= <toTimestamp>
RETURN {id:id(n1)} as fromNode, COLLECT(DISTINCT {id:id(n2)}) as toNode
数据 100K节点,它们之间有5亿个关系。
挑战 在某一天,存在 200万个关系,查询时间 ~50秒。
任何有助于优化查询,系统参数和对象模型的建议都值得赞赏。
答案 0 :(得分:1)
您可以使用APOC
为您的关系创建手动索引。
这是填充索引的查询:
MATCH ()-[r:COMMUNICATING_TO]->()
CALL apoc.index.addRelationship(r,['timestamp'])
RETURN count(*)
然后你可以检索你的关系,而不是:
CALL apoc.index.relationships('COMMUNICATING_TO','timestamp:[<fromTimestamp> TO <toTimestamp>]') YIELD rel, start , end
RETURN rel, start, end
另一种解决方案是通过将日期添加到COMMUNICATING_TO
关系类型来更改您的模型。示例:20180205_COMMUNICATING_TO
,20180206_COMMUNICATING_TO
,20180207_COMMUNICATING_TO
...