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

9
在下面的查询中,第二个匹配模式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个回答

7

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

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

在最后,即使在直接前的从句中没有使用,我还是回头参考了ac。同样,这只是通过使用一维句子来绘制两个维度关系的一种方式。我们用几个一维部分绘制了一个二维图片。
顺便说一下,我会将WITH从句与UNIX管道进行比较——我会将它们称为类比。WITH将把它找到的任何结果传送到你给它的下一组从句中。

那么您如何阅读匹配子句。a--b和b--c和c--d和d--e和a--c?混淆在于这一点。我在帖子中提到的查询应返回约翰的朋友看过但我没有看过的所有电影。如果您能解释如何解释您的示例将会很好。 - Aravind Yarram
3
如果你愿意,你可以这样阅读。在 a--b--ca--b, b--c 之间在语义上没有区别。它们的意思相同: "a与b相关,b与c相关"。唯一的句法差异是第一个将两个事实合并成一个句子。通常这是一个合理的方法,因为通常你在走一条非分支路径; 然而,如果你需要在两个方向上分叉,就不能在一行中完成,因此要使用两行。 - ean5533
1
回答你的另一个问题,是的,你的查询看起来对于“约翰的朋友看过但约翰没有看过的电影”是正确的。如果你没有得到预期的结果,你可以尝试在console.neo4j.org上放置一个样本数据集,让我们来试试。或者,你可以尝试删除MATCH的第二部分和你的WHERE子句,并用这个替换它们:WHERE not(john-[:HAS_SEEN]->(movie)) - ean5533
在你的例子中,有两个分支需要匹配,即a-b-c-d-e和a-c。 - Aravind Yarram
3
可以将其写为a--b--c--d--e, a--c,意思相同。 - ean5533

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接