neo4j - 大关系数据集的查询延迟问题

时间:2018-02-07 11:21:04

标签: neo4j cypher

需要帮助减少大关系数据集的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秒

任何有助于优化查询,系统参数和对象模型的建议都值得赞赏。

1 个答案:

答案 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

链接到文档:https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_using_manual_index_on_relationship_properties

另一种解决方案是通过将日期添加到COMMUNICATING_TO关系类型来更改您的模型。示例:20180205_COMMUNICATING_TO20180206_COMMUNICATING_TO20180207_COMMUNICATING_TO ...