如何在neo4j中的相似/平行路径之间建立关系?

时间:2018-10-05 07:13:00

标签: graph neo4j cypher

我正在寻找一种在neo4j中批量创建相似/平行路径之间关系的方法。

示例图可能如下所示:

enter image description here

如您所见,粉红色节点(中间的一个)1 3个黄色节点,每个黄色节点September 2个红色节点。我正在尝试在3个节点的每个可能对之间创建3 :WRAPS关系。我尝试了以下Cypher语句:

:WRAPS

它返回所有黄色节点和关联的红色节点。该图如下所示:

enter image description here

但是,由于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,但它返回了一堆空数组。我打算比较每个路径中节点的长度和标签,但是找不到找到方法。你能帮忙吗?

1 个答案:

答案 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比较避免了每对有两个关系(每个方向一个),并避免了从节点到自身的关系。