Apache AGE — предложение MATCH и направление ребер
Я заметил необычный аспект, экспериментируя с предложением MATCH. Здесь я создал направленное ребро между вершинами как
SELECT * FROM cypher('university_graph', $$
CREATE ((n: Student {name : "John", bornIn : "USA"})-[e:
StudiesAt {since : 2020}]->(d: Department {name : "CS"}))
RETURN n, d
$$) AS (n agtype, v agtype);
Теперь, если я выполню следующий запрос AGE:
SELECT * FROM cypher('university_graph', $$
MATCH (a)-[e]-(b)
RETURN a.name, e.since, b.name
$$) AS (st_name agtype, st_since agtype, dept_name agtype);
Я получаю вывод как:
Но если я добавлю метку к любой из вершин, она даст правильное направление ребра. Запрос AGE:
SELECT * FROM cypher('university_graph', $$
MATCH (a: Student)-[e]-(b)
RETURN a.name, e.since, b.name
$$) AS (st_name agtype, st_since agtype, dept_name agtype);
Результат:
Поскольку я уже создал направленное ребро, идущее от вершины типа студента к вершине отдела, почему предложение MATCH не заботится о направлении (когда метка не добавлена к вершине) ребра. Является ли это преднамеренной особенностью предложения MATCH? Если да, то в чем причина этого.
2 ответа
Поскольку и студент, и кафедра имеют
MATCH (a)-[e]-(b)
Может пойти в любую сторону. Это может быть «Студент-[отношения]-Отдел» или «Отдел-[отношения]-Студент».
Таким образом, оба возвращенных результата полностью действительны, учитывая неоднозначный характер вашего запроса.
Если вы измените свой запрос на
MATCH (a:Student)-[e]-(b:Department)
RETURN a.name, e.since, b.name
Вы получите желаемый результат.
Предложение MATCH в Apache AGE:
вы можете проверить отсюда
Предложение MATCH позволяет указать шаблоны, которые Cypher будет искать в базе данных. Это основной способ получения данных в текущем наборе привязок. Стоит прочитать больше о спецификации самих паттернов в Patterns.
Когда вы создаете ребро между двумя вершинами без указания направления, AGE автоматически создает ненаправленный возраст, что означает, что ребро можно пройти в любом направлении.
В вашем первом запросе вы не указали и метку для вершин, теперь AGE не имеет никакой информации о направлении ребра. Затем, когда вы используете MATCH для поиска всех adges, предложение AGE рассматривает ребра как ненаправленные и возвращает как входящие, так и исходящие вершины.