我想在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_likes
和is_liked_by
属性都是冗余的——您不需要它们。
这种简化的数据模型(没有这些属性)将允许多个人为每部电影共享相同的Movie
节点:
(:Movie {name: "foo"})-[:VIEWED_BY]->(:Person {name: "bar"})
(:Movie {name: "foo"})-[:LIKED_BY]->(:Person {name: "bar"})
您可以:
通过这种方式获取电影《精灵》的点赞数量:
MATCH (m:Movie)-[:LIKED_BY]->(:Person) WHERE m.name = 'Elf' RETURN m AS movie, COUNT(*) AS num_likes;
通过以下方式获取每部电影的点赞数(每部电影及其计数将显示在单独的结果行中):
MATCH (m:Movie)-[:LIKED_BY]->(:Person) RETURN m AS movie, COUNT(*) AS num_likes;
通过这种方式收集喜欢电影《精灵》的人:
MATCH (m:Movie)-[:LIKED_BY]->(p:Person) WHERE m.name = 'Elf' RETURN m AS movie, COLLECT (p) AS likers;
以这种方式收集喜欢每部电影的人(在单独的结果行中):
MATCH (m:Movie)-[:LIKED_BY]->(p:Person) RETURN m AS movie, COLLECT (p) AS likers;
您也可以使用VIEWED_BY
关系类型执行类似的查询。
我不确定"填充字段"是什么意思,但使用此查询,您只能返回is_liked_by
为true
的电影,还可以返回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