Совпадение на кратчайшем расстоянии с функцией агрегирования min () в Cypher - PullRequest
0 голосов
/ 16 октября 2019

У меня есть узлы станции и узлы соседства. Они оба имеют атрибут местоположения типа point типа пространственных данных.

Мне нужно создать связь между узлами (станция принадлежит ближайшему соседству). Поэтому я должен получить только один ряд на станцию. Тем не менее, мой запрос возвращает все комбинации в результате.

MATCH (n:Neighborhood),(s:Station)
WITH n, s, min(distance(n.centerLocation, s.point)) AS shortest
WHERE distance(n.centerLocation, s.point) = shortest
RETURN s.stationId, n.name, shortest
ORDER BY s.stationId

1 Ответ

1 голос
/ 16 октября 2019

[ОБНОВЛЕНО]

Ваш агрегат использует и n, и s в качестве ключей группировки, а не просто s.

Это должноработа для вас:

MATCH (n:Neighborhood), (s:Station)
WITH n, s, distance(n.centerLocation, s.point) AS dist
ORDER BY dist
RETURN s.stationId, COLLECT(n)[0].name AS name, COLLECT(dist)[0] AS shortest
ORDER BY s.stationId

Обратите внимание, что этот запрос будет медленным (и, возможно, нехваткой памяти), если у вас много окрестностей и станций, так как он должен будет оценить каждую возможную комбинациюокрестности и станции.

В качестве возможного обходного пути вы можете создать сравнительно небольшое количество Region узлов и связать каждые Station и Neighborhood с определенным регионом. Как только это будет сделано, вы можете уменьшить количество комбинаций, которые необходимо оценить. Например:

MATCH (n:Neighborhood)-[:IN_REGION]->()<-[:IN_REGION]-(s:Station)
WITH n, s, distance(n.centerLocation, s.point) AS dist
ORDER BY dist
RETURN s.stationId, COLLECT(n)[0].name AS name, COLLECT(dist)[0] AS shortest
ORDER BY s.stationId

Для лучших результатов вы также можете поместить Station или Neighborhood в несколько регионов, если его расстояния до центральных точек этих регионов отличаются только на некоторый порог.

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