Изключване на път от йерархия въз основа на клауза where от Graph DB(Neo4j)

Имам дървовидна структура и връзка между родител и дете

A(ROOT) -> CHILD 1 -> CHILD 2-> CHILD3(LEAF) ==== 1st Path
A(ROOT) -> CHILD 4 --> CHILD 5 -> CHILD6 (LEAF) == 2nd Path
A(ROOT) -> CHILD 7 --> CHILD 8 -> CHILD 9 (LEAF) == 3rd Path
A(ROOT) -> CHILD 10 --> CHILD 11 -> CHILD 12 (LEAF) == 4th Path

и така нататък...

Сега искам да напиша шифрована заявка, за да получа всички йерархии за A за 1-ви и 3-ти път въз основа на някое условие и ИЗКЛЮЧВАНЕ на пълния път 2-ри и 4-ти от резултата. Какво трябва да бъде запитването. Условие може да бъде всякакви свойства на възел, като йерархия за изключване на възел, които са задали популярния флаг като фалшив.

Така че в този случай да кажем, че всяко дете има флаг ПОПУЛЯРНО. И ако някой възел има флаг, зададен popular на false, ние искаме да изключим това конкретно дете и възли под него също.


person Ankit Bansal    schedule 17.01.2017    source източник
comment
Какво сте опитвали досега? Може да намерите Cypher refcard за полезна при намирането на решение, ако не го направите това вече е маркирано.   -  person InverseFalcon    schedule 17.01.2017


Отговори (1)


  • При даден път можете да използвате функцията nodes, за да получите списък с възлите в пътя.

  • Предикатите на списъка ви позволяват да зададете правила за свойствата на елементите в списъка. none е предикатът на списъка, който указва, че точно 0 елемента в списъка отговарят на условието на предиката.

Така че, ако your_path е променливата, която представлява пътя, ще гледате клауза where с нещо като none(v in nodes(your_path) where v.popular = false)

person smartcaveman    schedule 17.01.2017
comment
Можете ли да ми дадете шифъра. Опитвах някакъв шифър, но не можах да напиша нито един шифър, който да работи по начина, по който предложихте. Също така съм написал едно cypher match p = (n:demo{id:1})-[:CHILD]-›(m) WHERE m.is_popular=true WITH m,p MATCH p1 = (m)-[CHILD*] -›(:demo) return p1,p Това работи само когато is_popular prop е директно дете на възел, но в моя сценарий може да е всяко ниво - person Ankit Bansal; 17.01.2017
comment
@smartcaveman Изглежда, че ограничението е върху свойствата на възела, а не върху свойствата на връзката, трябва да бъде лесна настройка, за да накарате отговора си да работи. - person InverseFalcon; 17.01.2017
comment
да, ограничението е върху свойствата на възела. - person Ankit Bansal; 17.01.2017
comment
@smartcaveman : Предполагам, че това е, което предлагате съвпадение p = (n:demo{id:1})-[k:CHILD*]-›(m) С k,m където няма (rel in k където m.is_popular= false) return m Но това не ми дава правилен резултат. Това е просто изключване на тази конкретна връзка, но не и пълен път. - person Ankit Bansal; 17.01.2017
comment
@AnkitBansal - не съвсем, по-скоро е where none(v in nodes(p) where v.is_popular = false) - person smartcaveman; 17.01.2017