此查询的目的是从现有图创建新关系。我有Category
个通过SUBCAT_OF
关系连接的节点。我想从每个SUBCAT_OF
(最多4个长度)中提取Category
个路径,并使用它们来创建一个由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)
答案 0 :(得分:0)
您的问题没有说明开始的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
和start
的每对不同节点之间仅存在一个end
关系(即使您的数据库具有多个SUBCAT_OF
关系)在同一对之间。
以下替代查询可能会更快一些,因为它将首先过滤掉重复的关系(由variable-length relationship模式产生):
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)