У меня есть ориентированный граф Neo4j, содержащий 2 вида узлов: узлы с метками в наборе 1 и узлы с метками в наборе 2. Я хотел бы создавать новые ребра (нового типа) между узлами в наборе 1 всякий раз, когда есть направленный путь от узла Set 1 к другому узлу Set 1, который проходит только через узлы Set 2 (возможно, 0 таких узлов Set 2).
Вот пример набора данных:
CREATE (a:A {id:"a"})-[:CONN]->(t1:T {id:"t1"}),
(t1)-[:CONN]->(b1:B {id:"b1"}),
(b1)-[:CONN]->(t2:U {id:"t1"}),
(t2)-[:CONN]->(c1:C {id:"c1"}),
(c1)-[:CONN]->(t3:T {id:"t3"}),
(t3)-[:CONN]->(d1:D {id:"d1"}),
(t3)-[:CONN]->(d2:D {id:"d2"}),
(d1)-[:CONN]->(t4:T {id:"t4"}),
(d2)-[:CONN]->(t4),
(t4)-[:CONN]->(e1:E {id:"e1"}),
(t4)-[:CONN]->(e2:E {id:"e2"})
В этом примере A
, B
, C
, D
и E
находятся в наборе 1, а T
и U
— в наборе 2, поэтому я хочу нарисовать новые ребра :AGG
следующим образом:
MATCH (a:A {id:"a"}), (b1:B {id:"b1"}), (c1:C {id:"c1"}), (d1:D {id:"d1"}),
(d2:D {id:"d2"}), (e1:E {id:"e1"}), (e2:E {id:"e2"})
CREATE (a)-[:AGG]->(b1),
(b1)-[:AGG]->(c1),
(c1)-[:AGG]->(d1),
(c1)-[:AGG]->(d2),
(d1)-[:AGG]->(e1),
(d1)-[:AGG]->(e2),
(d2)-[:AGG]->(e1),
(d2)-[:AGG]->(e2)
Что касается ребер CONN
, я знаю, что граф является DAG, поэтому мне не нужно беспокоиться о петлях.
Можно ли это сделать в Сайфере? Или кто-нибудь может предложить эффективный способ через интерфейсы Java (например, стратегию обхода)? Спасибо.