不用START语句,按标准改用MATCH语句后耗时严重
发布于 23 天前 作者 WMBao 96 次浏览 最后一次编辑是 22 天前 来自 问答

基于Neo4j建立了一个千万条边的数据库,结构为:(:Subject)-[:hasRole{scene:..., detail:...}]->(:Role)-[:hasPermission]->(:Permission),其中每个节点都有value和detail两个属性。每种节点各750个,所有关系共71m个。 现根据Subject节点的value和hasRole关系的scene属性查询存在关系的Permission节点,有以下两种Cypher语句查询方式:

  1. MATCH (s:Subject)-[hR:hasRole]->(r:Role)-[hP:hasPermission]->(p:Permission) WHERE s.value = {subject} AND hR.scene = {scene} RETURN p.value, p.detail;
  2. MATCH (s:Subject) WHERE s.value = {subject} RETURN id(s);后id作为参数传入START s=node(s) MATCH (s)-[hR:hasRole]->(r:Role)-[hP:hasPermission]->(p:Permission) WHERE hR.scene = {scene} RETURN p.value, p.detail;

一个查询在70.6m条关系中查到共282k条关系最终指向750个p节点,数据库处理第二种query(blockingGet获取全部数据)耗时约1.6s,第一种query耗时约10分钟。

但第二种语句在当前标准中已经被弃用了。

请问这个是什么原因?不胜感激

1 回复

在语句里加上 where id(n) = 1 速度会快很多 MATCH (s:Subject)-[hR:hasRole]->(r:Role)-[hP:hasPermission]->(p:Permission) WHERE id(n)= {node_s_id} AND id(r) = {node_r_id} AND s.value = {subject} AND hR.scene = {scene} RETURN p.value, p.detail;

3.x 的 id(n) = $node_id 类似于 2.x 的 START n = nodes($node_id)

回到顶部