我正在寻找一种在neo4j中批量创建相似/平行路径之间关系的方法。
示例图可能如下所示:
如您所见,粉红色节点(中间的一个)1
3个黄色节点,每个黄色节点September
2个红色节点。我正在尝试在3个节点的每个可能对之间创建3 :WRAPS
关系。我尝试了以下Cypher语句:
:WRAPS
它返回所有黄色节点和关联的红色节点。该图如下所示:
但是,由于path的类是:PARALLEL
,而不是MATCH (pink:Slide)-[:WRAPS]->(yellow:GroupBox)-[:WRAPS*]->(red:Content)
WHERE pink.uuid = "ca7e1d47-1fbe-4008-9617-ef41c8a04316"
MATCH path = (yellow)-[rel]->(red)
RETURN path
,所以我不能使用unwind / foreach来遍历它们。我也尝试过Path
,但它返回了一堆空数组。我打算比较每个路径中节点的长度和标签,但是找不到找到方法。你能帮忙吗?
答案 0 :(得分:0)
为便于进一步解答和解决方案,我注意到了我的图形创建语句:
CREATE
// left bunch
(pink:PinkNode {name: '369'})-[:WRAPS]->(yellow1:YellowNode {name: '190'}),
(yellow1)-[:WRAPS]->(red1:RedNode {name: '201'}),
(yellow1)-[:WRAPS]->(red2:RedNode {name: '198'}),
(pink)-[:WRAPS]->(red1),
(pink)-[:WRAPS]->(red2),
// upper bunch
(pink)-[:WRAPS]->(yellow2:YellowNode {name: '195'}),
(yellow2)-[:WRAPS]->(red3:RedNode {name: '204'}),
(yellow2)-[:WRAPS]->(red4:RedNode {name: '208'}),
(pink)-[:WRAPS]->(red3),
(pink)-[:WRAPS]->(red4),
// lower bunch
(pink)-[:WRAPS]->(yellow3:YellowNode {name: '192'}),
(yellow3)-[:WRAPS]->(red5:RedNode {name: '208'}),
(yellow3)-[:WRAPS]->(red6:RedNode {name: '210'}),
(pink)-[:WRAPS]->(red5),
(pink)-[:WRAPS]->(red6),
// "free" red ones
(pink)-[:WRAPS]->(red7:RedNode {name: '255'}),
(pink)-[:WRAPS]->(red8:RedNode {name: '166'}),
(pink)-[:WRAPS]->(red9:RedNode {name: '264'}),
(pink)-[:WRAPS]->(red10:RedNode {name: '269'});
您将通过以下Cypher语句实现三个节点对之间的所有可能关系:
CALL apoc.periodic.COMMIT('
MATCH
(pink:PinkNode)-[:WRAPS]->(yellow:YellowNode)-[:WRAPS]->(red:RedNode)
WITH yellow AS startNode, yellow AS endNode WHERE NOT (startNode)-[:PARALLEL]->(endNode) AND id(startNode) < id(endNode)
CREATE (startNode)-[:PARALLEL]->(endNode)
RETURN count(*)
', {limit: 10000});
基于第3行中三节点对的标识和选择,我在第4行中检查您所需的:PARALLEL
关系是否已经存在。如果没有,我创建它(第5行)。通过APOC library,我重新运行该语句,直到创建所有关系。
尤其对于图形处理,重复运行查询很有用 在单独的交易中,直到它无法处理并生成任何交易 结果了。因此,您可以分批迭代那些 不满足条件并对其进行更新,以便以后再执行。
该查询在单独的事务中重复执行,直到执行为止 返回0。
(taken from Neo4j APOC procedure index at GitHub)
第4行中的id比较避免了每对有两个关系(每个方向一个),并避免了从节点到自身的关系。