在我的java应用程序中,我正在从kafka读取事件并将其作为节点插入neo4j db中。我预计每天大约有1000万到1500万个节点。
节点的主要属性是 EVENT {uniqueId,id1,id2,id3,id4,eventTime,other-properties ...}
在插入1批节点(每批200个事件,大约需要150毫秒)之后,我调用一个密码查询,根据这些ID与过去1天的任何匹配EVENT创建关系。 一个事件可以连接到许多事件。
所有ID都是UUIDS的格式,我为 uniqueId 和 id1,id2,id3 id4 和 eventTime 上的索引创建了唯一约束
我的示例查询(对于id1)如下所示 uniqueIdList 是当前批处理事件的唯一ID:
CALL apoc.periodic.iterate(" 'MATCH (c:EVENT) WHERE c.uniqueId IN {uniqueIdList} with c " +
" MATCH (p:EVENT) WHERE p.eventTime > (timestamp() - 86400000 ) AND (p.id1 = c.id1) return p,c "+
" '," +
" 'MERGE (p)-[:RELATED_TO]-(c) ',"+
" {batchSize:1000, parallel:false, params:{ uniqueIdList:{uniqueIdList} } })
我在没有 apoc.periodic.iterate 的情况下尝试了上面的查询,但性能没有显着变化。
此外,由于我的数据在60天内变得陈旧,所以我每天运行一个密码查询,使用apoc.periodic.commit来删除超过60天的所有节点和关系。
我在服务器模式下使用neo4j 3.2.6。在我的测试中,我每天只能处理大约200万个EVENT。有什么方法可以提高性能吗?
以下是查询Explain Query
的EXPLAIN输出