我正在使用id检索图表的节点。一旦我得到一个节点,我正在检查节点id是否存在于我的id列表中。所以,在这里我想以两种方式分析查询的性能:
list_more_res = rest_List.subList(0, 20 > rest_List.size()-1 ? rest_List.size() : 20);
第一次查询:
i)Match and Retrieve
ii)Retrieve and Match
第二次查询:
MATCH (a{uid:4}) RETURN a
在第一个查询中,我是否在与uid匹配时检索节点,否则我正在检索节点,然后检查uid是否为4,如果不是则丢弃。
在第二个查询中,我正在检索节点,然后检查列表中是否存在节点ID,如果是,则返回。
第一个查询中的功能不明确。第一个查询到底发生了什么?
答案 0 :(得分:3)
您似乎暗示查询的编写方式定义了操作之间的顺序,但事实并非如此。 Cypher是一种声明性语言:你说出你想要的东西,它以尽可能最佳的方式处理执行。
之间完全没有区别MATCH (a {uid: 4}) RETURN a
和
MATCH (a) WHERE uid = 4 RETURN a
两个查询都表示您需要通过其uid
查找节点,并且引擎将执行(如所写)对节点的完整扫描以查找匹配的节点。如果向查询添加标签,并且对{1}}的标签有索引或unicity约束,则引擎将执行索引查找。
uid
除了MATCH (a) WHERE uid IN [1, 2, 3, 4] RETURN a
将根据列表进行检查,也会进行全面扫描,而
uid
将执行多值索引查找。