单个(可选)MATCH子句与多个子句之间的区别

bjl*_*ine 2 neo4j

有什么区别

OPTIONAL MATCH clauseA, clauseB
Run Code Online (Sandbox Code Playgroud)

OPTIONAL MATCH clauseA
OPTIONAL MATCH clauseB
Run Code Online (Sandbox Code Playgroud)

根据我使用的形式,我会得到不同的行为.

例如:

START n=node(111)
OPTIONAL MATCH n<-[links_n_in]-(n_from),n-[links_n_out]->(n_to)
RETURN n,COLLECT(n_from) AS n_from,COLLECT(links_n_in) AS links_n_in,COLLECT(n_to) AS n_to,COLLECT(links_n_out) AS links_n_out
Run Code Online (Sandbox Code Playgroud)

设计用于返回节点; 它是来自节点的传入关系; 它是传出的关系和节点.

我有一个由节点111组成的测试图,它有4个传出关系,每个关系指向同一节点(我有其他测试用例,其中111指向不同的节点).执行上述查询仅返回列'n'中的节点111.'n_from','links_n_in','n_to','links_n_out'的列为空.

如果我将查询修改为:

START n=node(111)
OPTIONAL MATCH n<-[links_n_in]-(n_from)
OPTIONAL MATCH n-[links_n_out]->(n_to)
RETURN n,COLLECT(n_from) AS n_from,COLLECT(links_n_in) AS links_n_in,COLLECT(n_to) AS n_to,COLLECT(links_n_out) AS links_n_out
Run Code Online (Sandbox Code Playgroud)

然后按预期填充n_to和link_n_out列.

Eve*_*man 5

第一种形式将其视为必须完全匹配的单个扩展模式.

第二种形式将它们视为不同的可选模式,并且可以分别匹配这两种模式.

因此,当您考虑它正在做什么时,您的结果才有意义 - 如果找不到整个OPTIONAL MATCH模式,则它与任何可选MATCH模式都不匹配.