根据另一种类型的节点依次将特定类型的节点彼此链接

时间:2019-06-21 10:21:31

标签: neo4j cypher

我想将与一个节点(与以前的节点不同)关联的所有(某种类型的)节点彼此链接。我将借助图表进行解释。下面给出的是我创建的图形的虚拟表示:- 命令:

// Movies are unique values in the dataset. 
LOAD CSV WITH HEADERS FROM "actors_movies.csv" AS dataset
CREATE (m:Movie{movie:dataset.name})
MERGE (a:Actor{name:dataset.actor})
MERGE (a)-[:ACTED{year:dataset.year}]->(m)

enter image description here

我希望我的图表如下所示,如果我查询一个演员,我应该能够遍历他们连续拍摄的所有电影:

enter image description here

我请求查询以创建上述图形。

1 个答案:

答案 0 :(得分:1)

好吧,如果只需要图形化结果,就可以基于每个查询的每个角色,可以通过virtual relationships使用APOC Procedures。这样,您就可以创建虚假的虚拟关系,这些虚假的虚拟关系在图形中实际上不存在,但是可以在图形结果视图中可视化。请记住,这些查询只能在查询期间持续使用,它们不会保存到图形中,您需要在每个要查看它们的查询处创建虚拟关系。

以下是适用于电影图的示例(来自neo4j浏览器中的:play movies):

MATCH (k:Person{name:'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)
WITH k, m
ORDER BY m.released ASC
WITH k, apoc.coll.pairsMin(collect(m)) as pairs // list of pairs of adjacent nodes
UNWIND pairs as pair
CALL apoc.create.vRelationship(pair[0], 'NEXT_MOVIE', {year:pair[1].released}, pair[1]) YIELD rel
RETURN k, pair[0] as m1, pair[1] as m2, rel

请记住,如果您确实希望将这些内容保存在图形中,则将需要一个通过每个演员查看这些电影的路径,因此您创建的关系将需要具有actorId之类的内容。属性,这样,当您需要匹配演员的电影路径时,您需要确保所有:NEXT_MOVIE关系都需要具有该演员的ID。

这是您可能以理智的方式执行此操作的唯一方法,否则您将不知道要遍历哪些关系,因为您需要了解哪个关系属于哪个演员的上下文。