PGQL — это реализация языка графовых запросов, разработанная и реализованная компанией Oracle, и при этом доступная как спецификация с открытым исходным кодом[1] вместе с программным обеспечением для анализа JVM[2][3].
Описание
PGQL сочетает в себе знакомый синтаксис SQL SELECT, включая выражения SQL и сортировку и агрегацию результатов, с языком сопоставления шаблонов, очень похожим на язык Cypher. Он позволяет запрашивать спецификацию графа и включает в себя средство для макросов для захвата «представлений шаблонов» или именованных подшаблонов. Он не поддерживает операции вставки или обновления, будучи разработанным в первую очередь для аналитической среды, такой как продукт PGX от Oracle. PGQL также был реализован в «Oracle Big Data Spatial and Graph» и в исследовательском проекте PGX.D/Async[4].
Пример использования
Создание графа, связывающего людей (таблица Person), компании (таблица Company) и счета (таблица Account)[5]:
CREATE PROPERTY GRAPH financial_transactions
VERTEX TABLES (Persons LABEL Person PROPERTIES ( name ),
Companies LABEL Company PROPERTIES ( name ),
Accounts LABEL Account PROPERTIES ( number ))
EDGE TABLES (
Transactions
SOURCE KEY ( from_account ) REFERENCES Accounts ( number )
DESTINATION KEY ( to_account ) REFERENCES Accounts ( number )
LABEL transaction PROPERTIES ( amount ),
Accounts AS PersonOwner
SOURCE KEY ( number ) REFERENCES Accounts ( number )
DESTINATION Persons
LABEL owner NO PROPERTIES,
Accounts AS CompanyOwner
SOURCE KEY ( number ) REFERENCES Accounts ( number )
DESTINATION Companies
LABEL owner NO PROPERTIES,
Persons AS worksFor
SOURCE KEY ( id ) REFERENCES Persons ( id )
DESTINATION Companies
NO PROPERTIES)
SELECT, показывающий владельцев счетов, которые совершали транзакции с человеком по имени Nikita:
SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita
FROM MATCH (
(p:Person) <-[:owner]- (account1:Account),
(account1) -[t:transaction]- (account2), /* match both incoming and outgoing transactions */
(account2:Account) -[:owner]-> (owner:Person|Company)
) ON financial_transactions
WHERE p.name = 'Nikita'
GROUP BY owner
Или используя PGQL со стандартным синтаксисом SQL:
SELECT account_holder, SUM(amount) AS total_transacted_with_Nikita
FROM GRAPH_TABLE ( financial_transactions
MATCH (p IS Person) <-[IS owner]- (account1 IS Account),
(account1) -[t IS transaction]- (account2), /* match both incoming and outgoing transactions */
(account2 IS Account) -[IS owner]-> (owner IS Person|Company)
WHERE p.name = 'Nikita'
COLUMNS (owner.name AS account_holder, t.amount)
)
GROUP BY account_holder
Результат:
account_holder
|
total_transacted_with_Nikita
|
Camille
|
1000
|
Oracle
|
4501
|
Примечания
Ссылки