Псевдоним переменной Neo4J не распознан - PullRequest
0 голосов
/ 11 марта 2020

У меня есть три узла Person с различными отношениями. Каждый узел имеет широту и долготу.

enter image description here

Сначала я нахожу комбинации пар узлов:

MATCH (p1: Person)-[]->(p2: Person)
RETURN p1.name, p2.name

Мой вывод правильный: enter image description here

Далее я пытаюсь найти расстояния между парами узлов:

MATCH (p1:Person)-[]->(p2:Person)
WITH point({longitude: p1.longitude, latitude: p1.latitude}) AS p1Point,
point({longitude: p2.longitude, latitude: p2.latitude}) AS p2Point
RETURN (distance(p1Point, p2Point)) AS distance

Мой вывод здесь:

enter image description here

Наконец, я хочу собрать все вместе. Я хочу перечислить имена каждой пары узлов и соответствующее расстояние между ними:

MATCH (p1:Person)-[]->(p2:Person)
WITH point({longitude: p1.longitude, latitude: p1.latitude}) AS p1Point,
point({longitude: p2.longitude, latitude: p2.latitude}) AS p2Point
RETURN p1.name, p2.name, (distance(p1Point, p2Point)) AS distance

Я получаю ошибку, что p1 не определен.

enter image description here

В чем здесь проблема? Здесь описан похожий синтаксис: https://neo4j.com/docs/graph-algorithms/current/labs-algorithms/all-pairs-shortest-path/

1 Ответ

1 голос
/ 12 марта 2020

Предложение WITH отменяет привязку всех переменных, кроме тех, которые оно переносит.

Это должно работать:

MATCH (p1:Person)-->(p2:Person)
WITH p1, p2,
  point({longitude: p1.longitude, latitude: p1.latitude}) AS p1Point,
  point({longitude: p2.longitude, latitude: p2.latitude}) AS p2Point
RETURN p1.name, p2.name, distance(p1Point, p2Point) AS distance

Это также должно работать (так как WITH на самом деле не необходимо):

MATCH (p1:Person)-->(p2:Person)
RETURN p1.name, p2.name,
  distance(
    point({longitude: p1.longitude, latitude: p1.latitude}),
    point({longitude: p2.longitude, latitude: p2.latitude})) AS distance

[ОБНОВЛЕНО]

Кстати, с всегда двунаправленным отношением, таким как RELATED_TO, вы должны просто использовать одно неориентированное отношение вместо двух направленных отношений, указывающих в противоположных направлениях. Обратите внимание, что предложение CREATE поддерживает только создание направленных отношений, поэтому просто выберите любое произвольное направление - не имеет значения, какое. Позже, когда вы выполняете поиск, просто используйте ненаправленный поиск (например, MATCH (p1:Person)--(p2:Person) ...). Кроме того, вам следует выяснить, следует ли вместо этого использовать MERGE , поскольку это допускает неориентированный шаблон отношений.

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