使用gremlin或cypher查询整个图形

时间:2014-09-03 22:59:21

标签: neo4j cypher gremlin

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

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

依旧......

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

然后观看平均电影数量? 我如何在gremlin / cypher

中这样做

2 个答案:

答案 0 :(得分:4)

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

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

上面的代码显示我们迭代所有&#34;观看&#34;边缘和组在每个&#34;外观的顶点上观看&#34;边缘(即用户顶点)。小组计数存储在Map定义为m

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

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

答案 1 :(得分:3)

由于您要求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);