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

时间:2014-02-05 17:04:57

标签: neo4j

之间有什么区别
OPTIONAL MATCH clauseA, clauseB

OPTIONAL MATCH clauseA
OPTIONAL MATCH clauseB

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

例如:

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

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

我有一个由节点111组成的测试图,节点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

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

1 个答案:

答案 0 :(得分:5)

第一个表单将其视为必须完全匹配的单个扩展模式。

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

所以你的结果是有意义的,当你考虑它正在做什么时 - 如果找不到整个可选的MATCH模式,它就不会与任何可选的MATCH模式相匹配。