Если я правильно понимаю, каждый запрос, отправляемый при использовании расширения apacheAGE, анализируется, анализируется и переписывается, и, наконец, это оператор SQL, который выполняется в поддерживаемом процессе для postgres, чтобы фактически выполнить команду. Когда мы используем простой запрос соответствия, такой как
SELECT * FROM cypher('graph', $$ MATCH (u) return u $$) as (u agtype);
что такое оператор SQL, который запускает postgres, чтобы фактически получить правильные вершины?
Да, вы правы насчет первой части и поняли ее точно так же.
Однако во второй части я думаю, что оператор для простого запроса «Match (u) return u» будет выглядеть примерно так:
SELECT * FROM vertice_table;
Здесь vertice_table — это имя таблицы в базе данных PostgreSQL, содержащей вершины графа. И Select * будет использоваться для получения всех столбцов.
Надеюсь, это поможет!
Оператор sql, который будет сгенерирован, зависит от того, как граф представлен в postgres.
Это может быть что-то вроде этого:
SELECT * FROM graph_vertices WHERE label = 'u';
Это всего лишь упрощенный пример, и фактическое утверждение, конечно, может быть довольно сложным.
Да, на самом деле вы правы, когда мы запускаем запрос с использованием расширения Apache AGE, он анализирует запрос и анализирует его, а затем переписывает в оператор SQL.
Расширение переводит этот шифрованный запрос и результат
SELECT graph_properties FROM 'graph_name'
Поэтому, когда мы запускаем это, на самом деле выполняется SQL-запрос на бэкэнде и возвращаются свойства графика.
Если вы хотите получить возраст человека, используя предложение WHERE с некоторыми критериями, вы можете написать такой запрос:
SELECT * FROM graph_vertices WHERE label = 'u' AND properties->>'age' > '15';
PostgreSQL будет искать таблицу вершин, а затем собирать (в данном случае с помощью соединений) и возвращать вершины в соответствии с критериями и запросом, которые вы хотели. Например, для вашего запроса оператор SQL будет похож на что-то вроде:
SELECT * FROM graph._ag_label_vertex AS u
JOIN graph._ag_label_edges AS e
ON u.id = e.start
Переведенный оператор SQL будет выглядеть примерно так:
SELECT data FROM vertices
Предположим, что граф хранится в таблице с именем vertices
со столбцом с именем data
, который содержит свойства вершин.
Оператор SQL извлечет все строки из таблицы vertices
и вернет столбец данных, который содержит свойства вершин, соответствующие выходным данным шифрованного запроса.
В основном использует обычные операторы SQL…
Например
MATCH (u:persons) RETURN u
Эквивалентно
SELECT * FROM persons
А также там, где используется предложение WHERE, та же идея реализована в операторах SQL... и, конечно, это может усложниться в зависимости от отношений..
Да, это правильно, запрос проходит через эти этапы, пока в конце не станет оператором sql. В этом конкретном примере вы показали, что шифрованный запрос предназначен для извлечения всех вершин, которые будут переведены в оператор sql, который выглядит примерно так. : SELECT * FROM vertices_table
, это оператор sql, используемый postgres для получения всех вершин. Надеюсь, это ответит на ваш вопрос.
Да, именно так работает расширение Apache Age. Существует эквивалентный SQL-запрос для каждого запроса, который вы пишете в Apache AGE. Что касается вопроса, связанного с запросом выше Apache AGE, следующие запросы SQL будут эквивалентны,
SELECT * FROM graph_table WHERE label = 'u';
Теперь, когда вы посмотрите на приведенный выше запрос, graph_table представляет собой таблицу, в которой хранятся данные графика, а информация о метках узлов представлена меткой столбца. Предложение WHERE фильтрует строки на основе значения метки «u», извлекая вершины, соответствующие указанной метке, и на основе характера запроса, заданного в Apache AGE, оно может создавать более сложные эквивалентные SQL-запросы.
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Mark Smith'})-[]-(movie:Movie)
RETURN movie.title
$$) as (title agtype);
Приведенный выше код возвращает все вершины, связанные с человеком по имени «Марк Смит», которые помечены как Movie.