【问题标题】:Querying whole graph using gremlin or cypher使用 gremlin 或 cypher 查询整个图
【发布时间】:2023-03-29 13:17:02
【问题描述】:

所以,我有一个包含数百万个节点的图,示例是

      watched           director
user1 -------> movie_1 <------ chris nolan
                 ^
user2------------|  
      watched

等等……

我想生成一个查询来计算每个用户观看的电影数量?

然后平均观看的电影数量? 我如何在 gremlin/cypher 中做到这一点

【问题讨论】:

    标签: neo4j cypher gremlin


    【解决方案1】:

    由于您要求 Cypher 或 Gremlin,以下是 Cypher 查询。

    1. 对我来说,您的数据模型有任何节点标签并不明显,因此这里有一些查询仅包含至少观看过 1 部电影的用户节点。这种限制源于这样一个事实,即无法识别没有watched 传出关系的节点实际上是用户。

      (a) 如何获取每个不同的用户以及她/他观看的(不同的)电影的数量。 (未观看任何电影的用户将不会在返回的收藏中。)

      MATCH (u)-[:watched]->(m)
      RETURN u, COUNT(DISTINCT m);
      

      我假设您不想为同一用户计算同一部电影两次(在用户多次观看同一部电影的情况下)。

      (b) 如何获取所有用户(观看过任何电影的人)观看的(不同)电影的平均数量:

      MATCH (u)-[:watched]->(m)
      WITH u, COUNT(DISTINCT m) AS cdm
      RETURN avg(cdm);
      
    2. 如果您还想包括没有看过任何电影的用户,那么您可能需要确保所有用户节点都被标记(例如,通过标签“用户”)。在以下查询中,我假设已经完成。

      (a) 如何获取每个不同的用户以及她/他观看的(不同)电影的数量:

      MATCH (u:User)
      OPTIONAL MATCH (u)-[:watched]->(m)
      RETURN u, COUNT(DISTINCT m);
      

      (b) 如何获取所有用户观看的(不同)电影的平均数量:

      MATCH (u:User)
      OPTIONAL MATCH (u)-[:watched]->(m)
      WITH u, COUNT(DISTINCT m) AS cdm
      RETURN avg(cdm);
      

    【讨论】:

    • 谢谢,这很有帮助 :) 真的很感激
    【解决方案2】:

    这是 Gremlin 方法...首先用于每个人观看的电影(请注意,此代码是为在 Gremlin REPL 中运行而编写的):

    m = [:]
    g.E.has('label','watched').groupCount(m){it.outV.next()}.iterate()
    

    上面的代码显示我们迭代所有“被观察”的边并在每个“被观察”边的出顶点(即用户顶点)上进行分组。组计数存储在Map 中,定义为m

    现在我们有了m,我们可以使用它来获得平均值:

    total = m.values().sum()
    avg = total / m.size()
    

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 1970-01-01
      • 2012-11-29
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多