Neo4j - Проверьте, существует ли последовательный путь - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу посмотреть, существует ли путь для графа, учитывая список последовательных свойств для поиска.Список может иметь переменную длину.

Это моя последняя попытка:

WITH ['a', 'b', 'c', 'd'] AS search_list // can be any list of strings
// FOREACH (i IN range(search_list) |
//     MATCH (a:Node {prop:i})-->(b:Node {prop:i+1}))
// RETURN true if all relationships exist, false if not

Это решение не работает, потому что вы не можете использовать MATCH в FOREACH,Что мне делать вместо этого?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете попытаться создать запрос вручную для сопоставления всего пути и выполнить его, используя функцию apoc.cypher.run:

WITH ['a', 'b', 'c', 'd'] AS search_list
WITH search_list,
     'MATCH path = ' +  
     REDUCE(c = '', i in range(0, size(search_list) - 2) | 
            c + '(:Node {prop: $props[' + i + ']})-->'
     ) +
     '(:Node {prop: $props[' + (size(search_list) - 1)  +']}) ' +
     'RETURN count(path) as pathCount' AS cypherQuery
CALL apoc.cypher.run(cypherQuery, {props: search_list}) YIELD value
RETURN CASE WHEN value.pathCount > 0 
            THEN true 
            ELSE false 
       END AS pathExists
0 голосов
/ 05 февраля 2019

Если вы передадите список значений свойств в параметре $ props и длина этого списка будет 4, этот запрос сначала будет искать все пути длины 4, которые имеют желаемое начало иконечные узлы (чтобы сузить пути-кандидаты), а затем отфильтровать внутренние узлы путей:

MATCH p=(a:Node {prop: $props[0]})-[*4]->(b:Node {prop: $props[-1]})
WITH p, NODES(p)[1..-2] AS midNodes
WHERE ALL(i IN RANGE(1, SIZE(midNodes)) WHERE midNodes[i-1] = $props[i])
RETURN p;

Чтобы повысить эффективность, вы должны создать index для :Node(prop) какхорошо.

Если этот запрос ничего не возвращает, значит, нет подходящих путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...