Запрос 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