Вы пытались использовать filter()
или none()
? Я думаю, что я правильно понял вашу проблему, но вот как я использую вышеуказанные функции. (Если это, как раз downwote.)
Суть: нужно http://console.neo4j.org/?id=99xkcu
CREATE
(g:Person {name: 'Gorduin'}), (a:Person {name: 'Alvaro'}),
(pn:PhoneNumber {number: '555-512-2017'}),
(e11:Extension {extension: 11}),
(e27:Extension {extension: 27}),
(e19:Extension {extension: 19}),
(e11)-[:extension_of]->(pn)<-[:extension_of]-(e27),
(e19)-[:extension_of]->(pn),
(g)<-[:phone_number_of]-(e11),
(g)<-[:phone_number_of]-(e27),
(a)<-[:phone_number_of]-(e19),
(a)<-[:phone_number_of]-(pn);
переменной запроса длины, которые будут использоваться, поскольку :phone_number_of
указатель может исходить от расширения (привязка к номер телефона) или номер телефона. Стрелки направления не имеют значения, вы можете отменить любой из них и попробовать запросы ниже.
(Ограничение длины запроса будет очевидным решением в моей случае, например,
MATCH path = (p:Person)-[*1..3]-(n:PhoneNumber)
RETURN nodes(path);
, но это не вопрос Ор в.)
(1) Получение всех возможных путей от человека к номеру телефона (редактируется для удобства чтения):
MATCH path = (p:Person)-[*]-(n:PhoneNumber)
RETURN nodes(path) as every_possible_path_from_a_Person_to_a_PhoneNumber;
╒══════════════════════════════════════════════════════════════════════╕
│"every_possible_path_from_a_Person_to_a_PhoneNumber" │
╞══════════════════════════════════════════════════════════════════════╡
│[a,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e11,pn,e19,a,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e27,pn,e19,a,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e11,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[a,pn,e27,g,e11,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[a,e19,pn,e27,g,e11,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[a,e19,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e11,pn,a,e19,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e27,pn,a,e19,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[g,e27,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[a,pn,e11,g,e27,pn] │
├──────────────────────────────────────────────────────────────────────┤
│[a,e19,pn,e11,g,e27,pn] │
└──────────────────────────────────────────────────────────────────────┘
(2) С помощью none()
, чтобы удалить избыточность путем фильтрации путей, которые содержат конкретный узел (узел с определенными свойствами или метки):
MATCH path = (p:Person)-[*]-(n:PhoneNumber)
WITH nodes(path) as ns
WHERE NONE(node IN ns WHERE (exists(node.name) and node.name ='Gorduin'))
RETURN ns as path_nodes_NOT_containing_a_specific_person;
╒══════════════════════════════════════════════════════════════╕
│"path_nodes_NOT_containing_a_specific_person" │
╞══════════════════════════════════════════════════════════════╡
│[a,pn] │
├──────────────────────────────────────────────────────────────┤
│[a,e19,pn] │
└──────────────────────────────────────────────────────────────┘
(3) Используя filter()
для удаления определенного узла из возвращенных путей:
MATCH path = (p:Person)-[*]-(n:PhoneNumber)
WITH nodes(path) as ns
WHERE NONE(node IN ns WHERE (exists(node.name) and node.name ='Gorduin'))
RETURN filter(node in ns WHERE NOT node:Person) as personless_nodelist;
╒══════════════════════════════════════════════════════════════╕
│"personless_nodelist" │
╞══════════════════════════════════════════════════════════════╡
│[pn] │
├──────────────────────────────────────────────────────────────┤
│[e19,pn] │
└──────────────────────────────────────────────────────────────┘
Спасибо @InverseFalcon, я посмотрю. Не знал, что такой удивительный плагин существует ...! :) –
Я выполняю процедуру 'allSimplePaths' таким образом' MATCH (from: Post {postId: 71}), (to: Post {postId: 71}) CALL apoc.algo.allSimplePaths (from, to, 'RELATES_TO' , 5) путь выхода RETURN * ' Он возвращает один узел, тот, у которого есть свойство' postId = 71' –
Это несчастливо. Завтра я зарегистрирую ошибку. – InverseFalcon