Neo4j 中的邻域聚合查询

Posted

技术标签:

【中文标题】Neo4j 中的邻域聚合查询【英文标题】:Neighbourhood Aggregation query in neo4j 【发布时间】:2018-06-14 00:40:34 【问题描述】:

我们正在评估是否在我们的项目中使用像 neo4j 这样的图形数据库。为了评估,我们需要知道在 neo4j 中是否可以进行特定的邻域聚合查询。 这是我们正在考虑的图形设计。 我们有两种节点如下 - 用户 - 电影

并且只有用户节点和电影节点之间存在边。如果用户对电影进行了评分,则存在一个节点。

我们想要编写一个查询,根据我们对邻居(即用户)进行的聚合来计算所有电影的星级。

例如,用户 A 将电影 m1 评为 2,将 m2 评为 3 用户 B 将电影 m1 评为 1,将 m3 评为 5

所以结果集是

m1 - (2+1)/2 = 1.5
m2 - 3/1 = 3
m3 - 5/1 = 5

【问题讨论】:

【参考方案1】:

这很简单:

MATCH (:User)-[r:RATED]->(movie:Movie)
RETURN movie, AVG(r.rating) AS avg_rating;

假定的数据模型具有UserMovie 节点,以及包含rating 属性的RATED 关系。

(此外,由于在此数据模型中只有 User 节点可以对电影进行评分,因此您可以将 MATCH 模式简化为:()-[r:RATED]->(movie:Movie),这样执行速度会更快。)

【讨论】:

感谢cybersam的回答。赞赏。只是一个后续问题。假设评分是动态的,每次我们想要计算 avg_rating 时它都会不断变化。所以想法是我们每次都从其他数据库中获取评级并动态地输入图形数据库。这可能吗? 每次运行查询时,都会看到当时所有已提交的更改。欲了解更多信息,see here。

以上是关于Neo4j 中的邻域聚合查询的主要内容,如果未能解决你的问题,请参考以下文章

无法对包含 MySql 中的聚合或子查询的表达式执行聚合函数

聚合查询中的性能更新

查询分组中的 Oracle SQL 条件聚合函数

django 中的聚合函数,分组函数,F 查询, Q查询

ElasticSearch的高级复杂查询:非聚合查询和聚合查询

聚合石墨烯/django 查询中的字段