PGQL — это реализация языка графовых запросов, разработанная и реализованная компанией Oracle, и при этом доступная как спецификация с открытым исходным кодом вместе с программным обеспечением для анализа JVM.

Описание PGQL сочетает в себе знакомый синтаксис SQL SELECT, включая выражения SQL и сортировку и агрегацию результатов, с языком сопоставления шаблонов, очень похожим на язык Cypher. Он позволяет запрашивать спецификацию графа и включает в себя средство для макросов для захвата «представлений шаблонов» или именованных подшаблонов. Он не поддерживает операции вставки или обновления, будучи разработанным в первую очередь для аналитической среды, такой как продукт PGX от Oracle. PGQL также был реализован в «Oracle Big Data Spatial and Graph» и в исследовательском проекте PGX.D/Async.

Пример использования Создание графа, связывающего людей (таблица Person), компании (таблица Company) и счета (таблица Account): 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_holdertotal_transacted_with_NikitaCamille1000Oracle4501

Примечания

Ссылки Официальный сайт языка PGQL Официальная документация по языку PGQL Сравнение Cypher, PGQL и G-Core.

Категория:Информационные языки