Исключение пути из иерархии на основе предложения where из базы данных Graph (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. И если какой-либо узел имеет флаг Popular, установленный в false, мы также хотим исключить этот конкретный дочерний элемент и узлы под ним.


person Ankit Bansal    schedule 17.01.2017    source источник
comment
что ты уже испробовал? Если вы не это уже в закладках.   -  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
Не могли бы вы дать мне шифр. Я пробовал какой-то шифр, но не смог написать ни одного шифра, который мог бы работать так, как вы предложили. Также я написал одно зашифрованное совпадение 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 является прямым дочерним элементом узла, но в моем сценарии это может быть любой уровень - 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, где нет (отн. в 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