PGQL (PGQL)

Перейти к навигации Перейти к поиску
PGQL
Класс языка язык графовых запросов
Разработчик Oracle
Сайт pgql-lang.org (англ.)

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

Примечания

[править | править код]
  1. PGQL (англ.). pgql.org. Дата обращения: 6 октября 2019.
  2. van Rest, Oskar. PGQL: A property graph query language // Proceedings of the Fourth International Workshop on Graph Data Management Experiences and Systems : [англ.]. — ACM, June 2016. — P. 1–6. — ISBN 978-1-4503-4780-8. — doi:10.1145/2960414.2960421.
  3. van Rest, Oskar PGQL is an SQL-based query language for the Property Graph data model. (англ.). pgql.org (сентябрь 2015). Дата обращения: 3 ноября 2019.
  4. Roth, Nicholas P. PGX.D/Async: A Scalable Distributed Graph Pattern Matching Engine // Proceedings of the Fifth International Workshop on Graph Data-management Experiences & Systems. — ACM, 2017. — P. 1–6. — ISBN 978-1-4503-5038-9. — doi:10.1145/3078447.3078454.
  5. PGQL | Property Graph Query Language. pgql-lang.org. Дата обращения: 5 ноября 2024.