我写了一个密码查询。
MATCH (grade:Grade:`2547`:Transaction WHERE grade.NodeID="2547:12117:000:6839" or grade.NodeID="2547:12117:000:6841" or grade.NodeID="2547:12117:000:6840" or grade.NodeID="2547:12117:000:6843" or grade.NodeID="2547:12117:000:6842" or grade.NodeID="2547:12117:000:6845" or grade.NodeID="2547:12117:000:6844" or grade.NodeID="2547:12117:000:6838")-[vGrade:Version
WHERE vGrade.Status = "1"]->(grade:`2547`:Grade:Transaction)<-[rGrade:Grade
WHERE rGrade.Status = "1"]-(n:User:`2547`:Transaction)
WITH n, grade, vGrade.Document as GradeDocument
MATCH (LegalEntity:LegalEntity:`2547`:Transaction WHERE LegalEntity.NodeID="2547:12106:000:6167" or LegalEntity.NodeID="2547:12106:000:5754")-[vLegalEntity:Version
WHERE vLegalEntity.Status = "1"]->(LegalEntity:`2547`:LegalEntity:Transaction)<-[rLegalEntity:LegalEntity
WHERE rLegalEntity.Status = "1"]-(n:User:`2547`:Transaction)
WITH n, grade, GradeDocument, LegalEntity, LegalEntityDocument
RETURN n, Grade, GradeDocument, LegalEntity, LegalEntityDocument
我需要找到与给定的Grade ID和LegalEntity ID集相关的所有用户节点。查询的输出是所需的。但是我想知道是否有任何方法可以提高这个查询的性能,因为这是我生成的查询之一。但是所有查询的一般结构都是这样的。上述查询中MATCH语句中的nodeID数量只是一个示例,nodeID的实际数量可能会有所不同,但这是由代码处理的,结果结构与上面相同。此外,匹配语句的数量也可以根据需求增加。
目前,查询需要10-14秒,输出是正确的(结果有9500多条记录)。有没有什么方法可以减少查询的执行时间?
1条答案
按热度按时间gudnpqoy1#
1.您应该确保在相应标签的
NodeID
属性上有index(或唯一性约束,如果合适的话)。这将大大加快对具有特定NodeID
值的节点的查询速度。例如,如果每个
Transaction
节点都应该有一个唯一的NodeID
值,那么就像这样创建一个唯一性约束(它将自动为您创建一个索引):1.当你重用一个已经定义好的变量时,只要使用它的名字就可以了,而不要在任何程度上重新定义它。这种简化可以消除不必要的额外工作。在你的查询中,
(grade:
2547:Grade:Transaction)
应该是(grade)
,而(LegalEntity:
2547:LegalEntity:Transaction)
应该是(LegalEntity)
。1.对于查询的非静态部分,应该传递parameters。这样,服务器只需要编译一次查询,不管您使用不同的参数值调用它多少次。
此示例说明如何重构查询以使用参数$gradeIds和$entIds,其中每个参数都必须是id列表。此外,此查询还尝试修复查询中的一个错误,其中未定义
LegalEntityDocument
。它还修复了上面的项目#2。