返回neo4j密码中的关系计数



我想在neo4j查询中设置特定类型的关系数。

例如,

一个人看了很多电影,他喜欢他看过的一些电影。电影-观看者->个人电影-点赞者->个人

Movie对象有一个布尔字段"is_liked_by"和一个整数字段"no_of_likes"以及其他字段。如果一个人喜欢这部电影,则"is_liked_by"字段应为true,而"no_of_likes"字段应给出总点赞数。

Cypher获取名为P1 的人观看的电影

 MATCH (m:Movie)-[r:Viewed_By]->(p:Person) WHERE p.name = 'P1' RETURN m

但是,我将如何在同一查询中填充m.no_of_likes字段?

此外,我将如何填充m.is_liked_by字段?如果P1喜欢这部电影,这必须是真的,否则它应该是假的

这样的东西应该是你想要的:

MATCH (m:Movie)-[r:Viewed_By]->(p:Person) 
WHERE p.name = 'P1'
WITH 
   m, 
   p
RETURN
   m as movie_data,
   LENGTH(m-[:Liked_By]->(:Person)) as no_of_likes,
   EXISTS(m-[:Liked_By]->p) as is_liked_by

如果你想把它都放在一个数据结构中,你可以这样做(movieprop1和movieprop2是你的电影节点上的属性,你可以添加任何你想要返回的东西:

MATCH (m:Movie)-[r:Viewed_By]->(p:Person) 
WHERE p.name = 'P1'
WITH 
   m, 
   p
RETURN
   {
      moviefield1: m.moviefield1,
      moviefield2: m.moviefield2,
      no_of_likes: LENGTH(m-[:Liked_By]->(:Person)),
      is_liked_by: EXISTS(m-[:Liked_By]->p)
   } as movie

[编辑]

您所描述的数据模型(对于给定的电影,每个人似乎需要一个不同的Movie节点实例)不起作用。在每个Movie节点中维护no_of_likes计数将是一场噩梦,并且完全没有必要。事实上,no_of_likesis_liked_by属性都是冗余的——您不需要它们。

这种简化的数据模型(没有这些属性)将允许多个人为每部电影共享相同的Movie节点:

(:Movie {name: "foo"})-[:VIEWED_BY]->(:Person {name: "bar"})
(:Movie {name: "foo"})-[:LIKED_BY]->(:Person {name: "bar"})

您可以:

  1. 通过这种方式获取电影《精灵》的点赞数量:

     MATCH (m:Movie)-[:LIKED_BY]->(:Person)
     WHERE m.name = 'Elf'
     RETURN m AS movie, COUNT(*) AS num_likes;
    
  2. 通过以下方式获取每部电影的点赞数(每部电影及其计数将显示在单独的结果行中):

     MATCH (m:Movie)-[:LIKED_BY]->(:Person)
     RETURN m AS movie, COUNT(*) AS num_likes;
    
  3. 通过这种方式收集喜欢电影《精灵》的人:

     MATCH (m:Movie)-[:LIKED_BY]->(p:Person)
     WHERE m.name = 'Elf'
     RETURN m AS movie, COLLECT (p) AS likers;
    
  4. 以这种方式收集喜欢每部电影的人(在单独的结果行中):

     MATCH (m:Movie)-[:LIKED_BY]->(p:Person)
     RETURN m AS movie, COLLECT (p) AS likers;
    

您也可以使用VIEWED_BY关系类型执行类似的查询。

我不确定"填充字段"是什么意思,但使用此查询,您只能返回is_liked_bytrue的电影,还可以返回no_of_likes属性:

MATCH (m:Movie)-[r:Viewed_By]->(p:Person)
WHERE p.name = 'P1'
AND m.is_liked_by = true
RETURN DISTINCT m, m.no_of_likes

我认为一般情况下,您应该使用图形结构进行查询。no_of_likes是电影中的关系数:

MATCH (m:Movie)-[r:Liked_By]->(p:Person)
RETURN m.name, count(r) as no_of_likes

获取所有被某人喜欢的Movies

MATCH (m:Movie)-[:Liked_By]-()
RETURN m AS movie_has_like

如果你想MATCH Person观看喜欢的所有电影(我认为这是你的第一个查询):

MATCH (m:Moview)-[:Viewed_By]->(p:Person)<-[:Liked_By]-(m)
RETURN DISTINCT p, m

相关内容

  • 没有找到相关文章

最新更新