Запрос Neo4j для получения нескольких подключенных узлов

В моем графе я хочу получить соседей первой, второй и третьей степени определенного узла. Если мой графикA -> B -> C -> D -> E, затем

  • соседом первой степени C является B
  • соседом второй степени C является A
  • сосед третьей степени C не равен нулю

При проверке соседей иду в обратном направлении от края. Чтобы получить эти узлы, я написал следующий запрос.

      MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
MATCH (neig2: Function)-[:CALLS]->(neig1)
MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName,  neig3.functionName

Я понял, что этот код не возвращает B как соседа C первой степени, поскольку у A нет соседей (neig3 пуст). Другими словами, этот запрос требует, чтобы узел имел соседа третьей степени. Я это понял, но не смог обновить свой код. Как мне пересмотреть мой запрос?

1 ответ

Вы можете использовать НЕОБЯЗАТЕЛЬНОЕ ПОИСКПОЗ, так как A может не иметь соседа. Тогда запрос вернет нулевое значение для neigh3.

      MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1)
OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName,  neig3.functionName
Другие вопросы по тегам