Cypher匹配查询操作的模糊性

时间:2016-10-06 07:24:58

标签: neo4j cypher

我正在使用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,如果是,则返回。

第一个查询中的功能不明确。第一个查询到底发生了什么?

1 个答案:

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

将执行多值索引查找。