澄清Cypher查询中的多个MATCH模式

时间:2013-05-09 16:31:24

标签: neo4j cypher

在下面的查询中,第二个匹配模式john-[r?:HAS_SEEN]->(movie)是否会在第一个匹配john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)的结果上运行。我试图理解这是否与unix管道概念类似,即第一个模式的结果是第二个模式的输入。

start john=node(1)
match
john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie),
john-[r?:HAS_SEEN]->(movie)
where r is null
return movie;

2 个答案:

答案 0 :(得分:6)

我认为我不会将多个MATCH子句与UNIX管道概念进行比较。使用多个逗号分隔的匹配只是打破用单个句子写入关系的一维约束的一种方法。例如,以下内容完全有效:

MATCH a--b, 
      b--c, 
      c--d, 
      d--e,
      a--c

最后,我回过头来引用ac,即使它们之前没有被使用过。同样,这只是通过仅使用一维句子来绘制两个维度的关系价值的方式。我们正在绘制一个包含多个一维片段的二维图片。

另外,我会将WITH子句与UNIX管道进行比较 - 我称之为类似。 WITH会将找到的任何结果输出到您提供的下一组子句中。

答案 1 :(得分:2)

是的,只需将这两个匹配视为一个 - 即

match (movie)<-[r?:HAS_SEEN]-john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)

match john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)<-[r?:HAS_SEEN]-john