Neo4j возвращает дубликаты узлов при обходе - PullRequest
2 голосов
/ 27 сентября 2019

При запросе ne04j для заказа на перемещение.он пересекает несколько раз несколько узлов.Я прилагаю запрос шифра для создания узлов и отношений и результатов, которые он возвращает.Любая помощь приветствуется.

CREATE (a:Package {name:'A'})
CREATE (b:Package {name:'B'})
CREATE (c:Package {name:'C'})
CREATE (d:Package {name:'D'})
CREATE (e:Package {name:'E'})
CREATE (f:Package {name:'F'})
CREATE (g:Package {name:'G'})
CREATE (h:Package {name:'H'})
CREATE (i:Package {name:'I'})
CREATE (o:Package {name:'O'})
CREATE (z:Package {name:'Z'})
CREATE (j:SEG2 {name:'India'})
CREATE (k:SEG1 {name:'Natural Account'})
CREATE (l:SEG3 {name:'Engineering'})
CREATE (m:SEG4 {name:'Currency'})


create (a)-[:DEPENDS_ON]->(b)
create (a)-[:DEPENDS_ON]->(d)
create (d)-[:DEPENDS_ON]->(e)
create (b)-[:DEPENDS_ON]->(c)
create (b)-[:DEPENDS_ON]->(f)
create (b)-[:DEPENDS_ON]->(g)
create (h)-[:DEPENDS_ON]->(g)
create (i)-[:DEPENDS_ON]->(a)
create (z)-[:DEPENDS_ON]->(a)
create (i)-[:DEPENDS_ON]->(z)
create (o)-[:DEPENDS_ON]->(i)
create (j)-[:MAP_TO]->(a)
create (k)-[:MAP_TO]->(a)
create (l)-[:MAP_TO]->(a)
create (m)-[:MAP_TO]->(a)
return a,b,c,d,e,f,g,h,i,j,k,l,m,o,z

запрос шифрования:

MATCH (s3:SEG3{name:'Engineering'})-[:MAP_TO]->(ANODE:Package{name:'A'}) 
WITH ANODE 
MATCH (s4:SEG4{name:'Currency'})-[:MAP_TO]->(ANODE)  
MATCH (GG)-[:DEPENDS_ON*0..]->(ANODE) 
RETURN collect(GG.name)

Результат:

["A", "I", "O", "Z", "I", "O"]

Я ожидаю

["A","Z", "I", "O"]

1 Ответ

1 голос
/ 27 сентября 2019

Это потому, что вы можете получить свой результат через несколько путей в ваших данных.На основе чата вам нужен порядок, в котором могут быть разрешены зависимости.Чтобы получить этот порядок, вы можете отсортировать по максимальной длине пути от корня:

MATCH (s3:SEG3{name:'Engineering'})-[:MAP_TO]->(ANODE:Package{name:'A'}),
  (s4:SEG4{name:'Currency'})-[:MAP_TO]->(ANODE),
  p=(GG)-[:DEPENDS_ON*0..]->(ANODE) 
WITH GG.name as name,max(length(p)) as l
ORDER BY l
RETURN collect(name)

Также обратите внимание, что вам не нужно повторять предложение MATCH для каждой части шаблона.

...