для определения наличия соединения между A1 и A94
Это ключ. На самом деле вы не ищете все возможные пути (это то, что пытается сделать ваше MATCH) между двумя узлами, а проверяете, существует ли хотя бы один путь. Таким образом, ваш запрос выполняет гораздо больше работы, чем на самом деле нужно.
Есть несколько способов изменить ваш запрос, чтобы сделать меньше работы (но сначала убедитесь, что у вас есть индекс для :Entity(name)
начальные поиски):
- ОГРАНИЧИТЕ ваши результаты до 1, что приведет к остановке запроса после обнаружения первого совпадения:
MATCH p=(a:Entity{name: 'A 0'})-[r:SENDS_TO*..]->(d:Entity{name: 'A 94'})
RETURN p
LIMIT 1
Используйте функцию ПОИСКПОЗ () для выполнения двунаправленного расширения в ширину, пока не будет найден кратчайший путь между двумя узлами:
MATCH (a:Entity{name: 'A 0'}), (d:Entity{name: 'A 94'})
MATCH p = shortestPath((a)-[r:SENDS_TO*..]->(d))
RETURN p
Используйте процедуры расширения пути из APO C Процедуры, определяя конечный узел и ограничивая результаты до 1:
MATCH (a:Entity{name: 'A 0'}), (d:Entity{name: 'A 94'})
CALL apoc.path.spanningTree(a, {relationshipFilter:'SENDS_TO>', endNodes:[d], limit:1}) YIELD path
RETURN path