从现有图创建新关系

时间:2019-06-11 23:53:47

标签: neo4j cypher

此查询的目的是从现有图创建新关系。我有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)

1 个答案:

答案 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_SUBCATstart的每对不同节点之间仅存在一个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)