Neo4j 密码匹配查询操作的模糊性

Neo4j 密码匹配查询操作的模糊性,neo4j,cypher,Neo4j,Cypher,我正在使用id检索图中的节点。一旦我得到一个节点,我将检查节点id是否存在于我拥有的id列表中。因此,这里我想从两个方面分析查询的性能: i)Match and Retrieve ii)Retrieve and Match 第一个问题: MATCH (a{uid:4}) RETURN a 第二个问题: MATCH (a) WHERE a.uid in [1,2,3,4] RETURN a 在第一个查询中,我是在检索与uid匹配的节点,还是检索一个节点,然后检查uid是否为4,如果不是,则删

我正在使用id检索图中的节点。一旦我得到一个节点,我将检查节点id是否存在于我拥有的id列表中。因此,这里我想从两个方面分析查询的性能:

i)Match and Retrieve
ii)Retrieve and Match
第一个问题:

MATCH (a{uid:4}) RETURN a
第二个问题:

MATCH (a) WHERE a.uid in [1,2,3,4] RETURN a
在第一个查询中,我是在检索与uid匹配的节点,还是检索一个节点,然后检查uid是否为4,如果不是,则删除

在第二个查询中,我检索节点,然后检查列表中是否存在节点id,如果是,则返回


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

您似乎暗示了编写查询的方式定义了操作之间的顺序,但事实并非如此。Cypher是一种声明性语言:你想说什么就说什么,它以尽可能最佳的方式处理执行。两者之间绝对没有区别

MATCH (a {uid: 4}) RETURN a

这两个查询都表示您需要通过其
uid
查找节点,并且引擎将(如所述)对节点进行完整扫描以查找匹配的节点。如果向查询中添加标签,并且该标签在
uid
上具有索引或唯一性约束,则引擎将执行索引查找

MATCH (a) WHERE uid IN [1, 2, 3, 4] RETURN a
也将执行完整扫描,但将对照列表检查
uid
,而

CREATE CONSTRAINT ON (n:Node) ASSERT n.uid IS UNIQUE;
MATCH (a:Node) WHERE uid IN [1, 2, 3, 4] RETURN a

将执行多值索引查找。

您似乎暗示了编写查询的方式定义了操作之间的顺序,但事实并非如此。Cypher是一种声明性语言:你想说什么就说什么,它以尽可能最佳的方式处理执行。两者之间绝对没有区别

MATCH (a {uid: 4}) RETURN a
MATCH (a) WHERE uid IN [1, 2, 3, 4] RETURN a

这两个查询都表示您需要通过其
uid
查找节点,并且引擎将(如所述)对节点进行完整扫描以查找匹配的节点。如果向查询中添加标签,并且该标签在
uid
上具有索引或唯一性约束,则引擎将执行索引查找

MATCH (a) WHERE uid IN [1, 2, 3, 4] RETURN a
也将执行完整扫描,但将对照列表检查
uid
,而

CREATE CONSTRAINT ON (n:Node) ASSERT n.uid IS UNIQUE;
MATCH (a:Node) WHERE uid IN [1, 2, 3, 4] RETURN a
将执行多值索引查找

MATCH (a) WHERE uid IN [1, 2, 3, 4] RETURN a