首页 > 解决方案 > 从现有图表创建新关系

问题描述

此查询的目的是从现有图创建新关系。我有通过关系Category连接的节点。SUBCAT_OF我想SUBCAT_OF从每个中提取路径Category(最长为 4)并使用它们来创建由NEW_SUBCAT关系组成的新路径。

我正在使用以下查询,但我不确定它是否正常工作:

MATCH (start:Category)
WHERE ()-[:SUBJECT]->(start)
MATCH path =((start)-[:SUBCAT_OF*1..4]-> (p1:Category))
UNWIND RELATIONSHIPS(path) AS rel
WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
MERGE (s)-[:NEW_SUBCAT]->(e)

标签: neo4jcypher

解决方案


您的问题没有说明起始Category必须具有传入SUBJECT关系。但是由于您的查询确实对此进行了过滤,因此我认为这是一项要求。

您的查询(在下面稍微清理)确实可以满足您的要求。

MATCH (start:Category)
WHERE ()-[:SUBJECT]->(start)
MATCH path = (start)-[:SUBCAT_OF*..4]->(:Category)
UNWIND RELATIONSHIPS(path) AS rel
WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
MERGE (s)-[:NEW_SUBCAT]->(e)

注意:此查询确保每对不同的和节点NEW_SUBCAT之间仅存在一个关系(即使您的数据库在同一对之间存在多个关系)。startendSUBCAT_OF


以下备用查询可能会更快一些,因为它会首先过滤掉重复的关系(由可变长度关系模式产生):

MATCH (start:Category)
WHERE ()-[:SUBJECT]->(start)
MATCH path = (start)-[:SUBCAT_OF*..4]->(:Category)
UNWIND RELATIONSHIPS(path) AS rel
WITH DISTINCT rel
WITH STARTNODE(rel) AS s, ENDNODE(rel) AS e
MERGE (s)-[:NEW_SUBCAT]->(e)

推荐阅读