Я пытаюсь реализовать упорядочение потоков в небольшой сети, используя cypher в neo4j. Я воссоздал сеть на изображении ниже, и я хочу добавить номер заказа потока по ссылке.
Сначала я попытался использовать оператор where, но это не похоже на <>, и в сети ничего не установлено после того, как ссылки порядка 2 проработаны.
match (n:StrahlerTest)-[:LINK]->(o:StrahlerTest)<-[:LINK]-(p:StrahlerTest)
where not (n)<-[:LINK]-()
with n,o,p
where not (p)<-[:LINK]-()
with n,o,p
match (o)-[r:LINK]->()
set r.strahler_number = 2
with n
match (:StrahlerTest)-[:LINK{strahler_number:2}]->(o:StrahlerTest)<-[r:LINK]-(p:StrahlerTest)
with o, r
match (o)-[r2:LINK]->(q)
where r.strahler_number <> 2 set r2.strahler_number = 2
with o, r
match (o)-[r2:LINK]->(q)
where r.strahler_number = 2 set r2.strahler_number = 3
with q
match (:StrahlerTest)-[:LINK{strahler_number:3}]->(o:StrahlerTest)<-[r:LINK]-(p:StrahlerTest)
with o, r
match (o)-[r2:LINK]->(q)
where r.strahler_number <> 3 set r2.strahler_number = 3
with o, r
match (o)-[r2:LINK]->(q)
where r.strahler_number = 3 set r2.strahler_number = 4
with q
match (:StrahlerTest)-[:LINK{strahler_number:4}]->(o:StrahlerTest)<-[r:LINK]-(p:StrahlerTest)
with o, r
match (o)-[r2:LINK]->(q)
where r.strahler_number <> 4 set r2.strahler_number = 4
Далее я попытался использовать Foreach, но оператор соответствия не может использоваться с оператором foreach.
match (n:StrahlerTest)-[:LINK]->(o:StrahlerTest)<-[:LINK]-(p:StrahlerTest)
where not (n)<-[:LINK]-()
with n,o,p
where not (p)<-[:LINK]-()
with n,o,p
match (o)-[r:LINK]->()
set r.strahler_number = 2
with [2,3,4] as num
foreach (n in num | match (:StrahlerTest)-[:LINK{strahler_number:n}]->(o:StrahlerTest)<-[r:LINK]-(:StrahlerTest))
with o, r, n
match (o)-[r2:LINK]->()
set r2.strahler_number =
case r2.strahler_number
when r.strahler_number <> n
then n
else n+1 end
Наконец я попытался расслабиться. Он работал до установки первого набора ссылок третьего порядка (т.е. непосредственно после двух ссылок порядка 2), но не предоставлял правильное значение для ссылки порядка 3, которая следует за другой ссылкой порядка 3 (когда ссылка порядка 1 присоединяется к сети).
match (n:StrahlerTest)-[:LINK]->(o:StrahlerTest)<-[:LINK]-(p:StrahlerTest)
where not (n)<-[:LINK]-()
with n,o,p
where not (p)<-[:LINK]-()
with n,o,p
match (o)-[r:LINK]->()
set r.strahler_number = 2
with [2,3,4] as num
unwind num as n
match (:StrahlerTest)-[:LINK{strahler_number:n}]->(o:StrahlerTest)<-[r:LINK]-(:StrahlerTest)
with o, r, n
match (o)-[r2:LINK]->()
set r2.strahler_number =
case r2.strahler_number
when r.strahler_number <> n
then n
else n+1 end
Надеюсь, это понятно. Буду очень признателен за любые идеи / советы о том, как заставить это работать.