【问题标题】:neo4j find all friends who posted something I likedneo4j 找到所有发布我喜欢的东西的朋友
【发布时间】:2021-05-05 18:10:23
【问题描述】:

我想找到所有发布了我喜欢的东西的朋友。为什么这个查询不返回任何行,但每个子句本身都会返回一些东西?

 match (start:Person)-[:LIKES]->(post:Post), (start)-[:FRIEND]->(person: Person), (person)-[:POSTED]->(post) return start, post, person

【问题讨论】:

  • 查询可以提高性能,但它似乎是一个正确的查询,我希望得到正确的结果。您可以对查询进行概要分析并添加扩展所有元素的计划吗?我们想看看对于哪个扩展行数变为零。我的猜测是关系类型或标签不太正确。
  • 我已经上传了一个计划。似乎过滤器(没有过滤器)正在过滤掉它。

标签: graph neo4j cypher


【解决方案1】:

感谢您的查询计划。

我们可以看到,在 (start)-[:FRIEND]->(person) 的扩展中,行数下降到零,因此发生了以下两种情况之一:或者 :FRIEND 不是实际的关系类型(可能是不匹配情况的问题),或者更有可能,所有存在的:FRIEND关系都是相反的方向,传入起始节点而不是传出。

对于像这样的社交图,因为它们都是 :Person 节点,所以没有办法判断关系是在哪个方向创建的,当您查询时,方向不重要,一切都应该重要是否存在 :FRIEND 关系。

尝试在此处从模式中删除方向:(start)-[:FRIEND]-(person: Person)。如果您的关系类型正确,那么您应该会得到正确的结果。

【讨论】:

    【解决方案2】:

    为简单起见,我还将这 3 个模式组合成一个长模式。这样做将确保它不会提取不适合以后模式的额外模式(被检索,然后稍后过滤掉)。这是 Cypher 的样子:

    MATCH (start:Person)-[:LIKES]->(post:Post)<-[:POSTED]-(person: Person)
    WHERE (start)-[:FRIEND]-(person)
    RETURN start, post, person
    

    【讨论】:

      【解决方案3】:

      我会开始

      MATCH (me:Person)-[:FRIEND]-(friend:Person)-[:POSTED]->(post:Post)<-[:LIKES]-(me)
      RETURN DISTINCT friend
      

      获取 (friend:Person) 节点

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 2017-02-24
        相关资源
        最近更新 更多