所以,我有一个包含数百万个节点的图表,例子是
watched director
user1 -------> movie_1 <------ chris nolan
^
user2------------|
watched
依旧......
我想生成一个查询来计算每个用户观看的电影数量吗?
然后观看平均电影数量? 我如何在gremlin / cypher
中这样做答案 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部电影的用户节点。这种限制源于这样一个事实,即没有办法确定没有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);
如果您还希望包含未观看任何电影的用户,则可能需要确保所有用户节点都已标记(例如,标记为“用户”)。在以下查询中,我假设已经完成了。
(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);