DOI: 10.15514/ISPRAS-2019-31(4)-14
Задача поиска путей в ациклических графах с ограничениями в терминах булевых грамматик
1 Е.Н. Шеметова, ORCID: 0000-0002-1577-8347 <[email protected]> 2 С.В. Григорьев, ORCID: 0000-0002-7966-0698 <[email protected]> 1 Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, 197101, Россия, г. Санкт-Петербург, Кронверкский пр., 49 2 Санкт-Петербургский государственный университет, 199034, Россия, г. Санкт-Петербург, Университетская наб., д. 7/9
Аннотация. Графовая модель данных активно используется в научных и прикладных областях, например, в графовых базах данных, биоинформатике, при анализе социальных сетей и в статическом анализе кода. Одной из основных задач, связанных с графовыми моделями, является поиск специфичных путей в графе. Естественным способом задать ограничения на пути являются формальные грамматики над метками рёбер графа, при этом запрос к графу может быть представлен в виде множества всех троек (A,v1,v2), для которых существует путь в графе от вершины v1 до вершины v2 такой, что метки на ребрах этого пути образуют строку, выводимую из нетерминала А в данной грамматике. Использование булевых грамматик позволяет формулировать более выразительные запросы по сравнению с традиционно используемыми регулярными и контекстно-свободными грамматиками. Известно, что задача выполнения запросов к графу с использованием булевых грамматик является неразрешимой. В данной работе предложен приближённый алгоритм поиска путей в ориентированных графах без циклов с ограничениями, заданными с помощью булевых грамматик. Благодаря ограничению на тип анализируемых графов, предложенный алгоритм является более асимптотически оптимальным, чем наивный итерационный алгоритм.
Ключевые слова: поиск путей с ограничениями; булевы грамматики; матричные операции; ациклический граф; булевы матрицы; произведение матриц.
Для цитирования: Шеметова Е.Н., Григорьев С.В. Задача поиска путей в ациклических графах с ограничениями в терминах булевых грамматик. Труды ИСП РАН, том 31, вып. 4, 2019 г., стр. 211-226. DOI: 10.15514/ISPRAS-2019-31(4)-14
Благодарности. Данная работа выполнена при поддержке гранта РНФ 18-11-00100 и JetBrains Research. Авторы выражают признательность Кознову Дмитрию Владимировичу за оказанную помощью при написании настоящей статьи.
Path querying on acyclic graphs using Boolean grammars
1 E.N. Shemetova, ORCID: 0000-0002-1577-8347 <[email protected]> 2 S.V. Grigorev, ORCID: 0000-0002-7966-0698 <[email protected]>
1 Saint Petersburg National Research University of Information Technologies, Mechanics and Optics, 49, Kronverkskiypr., St. Petersburg, 197101, Russia 2 Saint Petersburg State University, 7/9, Universitetskaya nab., St. Petersburg, 199034, Russia
Abstract. Graph data models are widely used in different areas of computer science such as bioinformatics, graph databases, social networks and static code analysis. One of the problems in graph data analysis is querying for specific paths. Such queries are usually performed by means of a formal grammar that describes the allowed edge-labeling of the paths. Path query is said to be calculated using relational query semantics if it is evaluated to triple (A, v1, v2), such that there is a path from v1 to v2 such that the labels on the edges of this path form a string derivable from the nonterminal A. As the regular and context-free languages have limited expressive power, we focus on a more expressive languages, namely the Boolean languages that use Boolean grammars to describe the labeling of paths. Although path querying using relational query semantics and Boolean grammars is known to be undecidable, in this work we propose a path querying algorithm on acyclic graphs which uses relational query semantics and Boolean grammars and approximates the exact solution. To achieve better performance in compare with the naive algorithm, considered classes of graphs were limited to acyclic graphs.
Keywords: path querying; Boolean grammars; matrix operations; acyclic graph; DAG; boolean matrix; matrix multiplication.
For citation: Shemetova E.N., Grigorev S.V. Path querying on acyclic graphs using Boolean grammars. Trudy ISP RAN/Proc. ISP RAS, vol. 31, issue 4, 2019. pp. 211-226 (in Russian). DOI: 10.15514/ISPRAS-2019-31(4)-14
Благодарности. This work was supported by a grant from the Russian Science Foundation 18-11-00100 and also by JetBrains Research. The authors are grateful to Dmitry Vladimirovich Koznov for the assistance in writing this article.
1. Введение
Графовая модель данных широко используется в различных областях, например, в графовых базах данных [1, 2], биоинформатике [3], моделировании и анализе социальных сетей [4, 5], в статическом анализе программного кода [6, 7, 8], а также в задачах на основе статического анализа в контексте проблемы промышленного реинжиниринга устаревших приложений [30].
Одной из важных задач анализа данных, представленных в виде графа, является задача поиска специфичных путей, например, с помощью формальных языков: если рёбра графа содержат метки, то путь задаёт слово, которое получается конкатенацией меток вдоль него. Таким образом, в качестве критерия для поиска можно использовать факт принадлежности полученного слова заданному языку. В результате возникает задача поиска путей с ограничениями, заданными в терминах формальных языков.
Многие современные языки запросов к графам, такие как Cypher [9], Gremlin [10], SPARQL [11], предоставляют средства задания ограничений в терминах регулярных языков или регулярных выражений. Однако этого недостаточно для решения многих задач статического анализа кода, например, для анализа иерархических зависимостей и поиска подобных элементов.
В результате возникает необходимость использовать более выразительные классы языков для задания ограничений - контекстно-свободные, конъюнктивные [12], булевы [13].
Вопрос использования контекстно-свободных грамматик в качестве ограничений активно исследуется в настоящее время [14, 15, 16]. При использовании более выразительных языков возникает вопрос о разрешимости задачи выполнения запросов к графу. Показано, что задача поиска путей в произвольных ориентированных графах с ограничениями в виде конъюнктивных и булевых языков неразрешима [15], однако для конъюнктивных языков предложен алгоритм, строящий приближение ответа сверху [20], что делает его применимым для приближённого решения прикладных задач. При этом, предложенный алгоритм является наивным итеративным алгоритмом. Возможность построения алгоритма, строящего приближённое решение для задачи поиска путей с ограничениями в виде булевых языков, не исследована.
Также отметим, что представленные выше алгоритмы работают с графами произвольной структуры. Для некоторых научных областей одними из наиболее часто анализируемых типов графов являются ациклические графы и деревья. Например, в статическом анализе кода это абстрактное синтаксическое дерево (AST), дерево вызовов с контекстами (CCT, calling context tree) [29] и другие, социальные иерархии в анализе социальных сетей представлены в виде ациклического графа [28]. Если исходный граф является ациклическим, то можно воспользоваться известными свойствами ациклических графов, чтобы предоставить более производительный алгоритм для решения задачи поиска путей с ограничениями для данной структуры графа. Пример подобного подхода рассмотрен в работе [8].
Несмотря на то, что задача является неразрешимой для произвольных ориентированных графов, для ориентированных графов без циклов она разрешима [15]. Однако для получения точного решения необходимо рассмотреть все пути в таком графе, число которых, как известно, экспоненциально зависит от числа вершин в графе. Одним из способов получения асимптотически более быстрого алгоритма является построение алгоритма, находящего приближённое решение задачи сверху. Такой алгоритм позволит значительно уменьшить множество возможных решений. Тогда, запустив на полученном множестве наивный алгоритм, можно найти точное решение задачи за меньшее время.
В данной работе предложен приближённый алгоритм поиска путей в ориентированных графах без циклов (Direct Acyclic Graph, DAG) с ограничениями в виде булевых грамматик. При этом алгоритм реализует так называемую реляционную семантику [14]: результатом работы алгоритма является отношение на вершинах графа и нетерминалах. Элемент отношения - тройка (A, v1, v2) означает, что в заданном графе существует путь из вершины v1 в вершину v2, такой, что соответствующее ему слово выводимо из нетерминала А в заданной грамматике. Доказано, что данный алгоритм строит приближение сверху. Благодаря ограничению на тип анализируемых графов удалось построить более асимптотически оптимальный, чем наивный итерационный, алгоритм, использующий идеи Валианта [21] и Охотина [22].
Работа организована следующим образом. В разд. 2 даны основные определения, связанные с задачей поиска путей с ограничениями в терминах булевых грамматик. В разд. 3 проанализированы существующие решения данной задачи. В разд. 4 представлена адаптация алгоритма Охотина [22], находящая аппроксимацию решения задачи поиска путей с ограничениями в терминах булевых грамматик с использованием реляционной семантики запросов для ациклических графов. Доказана также корректность применения данного алгоритма для поставленной задачи. В разд. 5 работа предложенного алгоритма продемонстрирована на примере. Заключение и направления будущих исследований приведены в разд. 6.
2. Основные определения 2.1 Терминология
Для начала определим задачу поиска путей с ограничениями в терминах булевых грамматик с использованием реляционной семантики запросов.
Рассмотрим ориентированный ациклический граф D = (V,E) и формальную грамматику G. Пусть у каждого ребра графа есть метка; множество всех меток обозначим Е. Тогда каждый путь в D будет обозначать слово над алфавитом из Е, полученное конкатенацией меток рёбер, включенных в этот путь. На рис. 1 изображен помеченный ациклический ориентированный граф с Е = [а,Ъ,с].
Для графа D и формальной грамматики G = (E,N,P), для любого А Е N обозначим отношения Ra £ V XV следующим образом:
Ra = {(n,m) | 3 пит (1(л) Е L(GA))}, где пит — это путь из вершины п в т, 1(п) — слово, полученное конкатенацией меток рёбер, принадлежащих пути п, а L(GA) обозначает язык, порожденный грамматикой G со стартовым нетерминалом А.
Рис. 1. Пример помеченного ориентированного ациклического графа c Е = {а, Ь, с} Fig. 1. Example of directed labelled acyclic graph with S = {a, b, c}
Таким образом, задача поиска путей в графе Б с ограничениями в терминах формальной грамматики С и с использованием реляционной семантики запросов сводится к нахождению всех троек (А, п, т), таких, что существует путь пит, а строка 1(п) выводима из нетерминала А в грамматике С, и это означает вычисление всех отношений ЯА для любого А Е N. В качестве формальной грамматики С мы будем использовать булевы грамматики [13]. Булева грамматика является классом формальных грамматик, расширяющим класс контекстно-свободных грамматик с помощью логических операций конъюнкции и отрицания.
Булева грамматика С формально определяется следующим образом: С = (Е,Ы,Р), где Е -терминальный алфавит, N - нетерминальный алфавит (множество нетерминальных символов [А±,А2,... ,Ап}), Р - множество правил грамматики.
Тогда правила булевой грамматики можно представить следующим образом:
А ^ аг&а2&... &ат&—р1& —Р2&... &—Рп , где А - это нетерминал, т + п > 1, а1,а2, ...ат,р1,р2, ...рп Е (Е иМ )*. Отметим, что в данном определении не выделен стартовый нетерминал, так как его можно будет определить во время поиска путей с ограничениями.
На рис. 2 показана булева грамматика для языка Ь(С3) = {акЪс | к Ф1}. В данном случае коньюнкт ВС порождает язык Ь(Сос) = [акЪ1с^ | 1=] = 1,к>0}, а конъюнкт АВ 214
порождает язык L(GAB) = {akblc' | к = i = 1, j > 0}. Тогда L(GS) = L(GDC) П L(GAB) = [akblc' | i=j = 1 и к Ф1}= [akbc | к Ф 1}.
5 ^DC&—AB
А ^ a
В ^ b
С ^ с
D ^ b
В ^ВС
D ^AD
Рис. 2. Пример булевой грамматики Fig. 2. Example of Boolean grammar
Булева грамматика G = (Z,N,P) находится в двоичной нормальной форме, если каждое правило в Р имеет следующий вид:
• А^ В1С1&.&ВтСт& -D1E1&...&-DnEn (т > 1,п > 0), или
• А^ а (а е Е).
Например, грамматика на рис. 2 находится в двоичной нормальной форме. Любая булева грамматика может быть переведена в эквивалентную ей булеву грамматику в двоичной нормальной форме [13]. Далее будем считать, что все рассматриваемые булевы грамматики находятся в двоичной нормальной форме.
2.2 Алгоритм Охотина
В данной работе предложено расширение алгоритма Охотина [22], являющегося алгоритмом синтаксического анализа для булевых грамматик. Алгоритм Охотина строит для входной строки а1а2 ... ап и булевой грамматики G = (Z,N,P) в двоичной нормальной форме таблицу синтаксического анализа Т, где элемент Ту — это набор нетерминалов, выводящий подстроку ai+1... üj входной строки, a 0 < i < j < п. Входная строка а1а2 ... ап принадлежит языку L(GS) тогда и только тогда, когда S е Т0п. Построение таблицы Т в данном алгоритме сведено к умножению булевых матриц различных размеров. Помимо таблицы Т, алгоритм использует дополнительную структуру данных — таблицу М, каждый её элемент My принадлежит множеству пар нетерминалов N х N, таких, что:
ми = {(В, С) I ai+1,...,cij е Lc(B),Lc(C)} для всех В,С е N и 0 < i < j < п. Используя значения My, можно получить набор нетерминалов, порождающих строку:
Tu = /КД
где /: 2NXN ^ 2N определена следующим образом: f(M) = {А I ЗЛ ^ В1С1&...& BmCm& -D1E1&...& -Dm,Em, е Р: (Bt,Ct) еМи (Dt,Et) £
М для Vt.
3. Родственные работы
Наиболее популярными запросами к графам являются запросы, использующие регулярные грамматики [2, 26, 27]. Вопрос использования контекстно-свободных грамматик в качестве ограничений для поиска путей активно исследуется в настоящее время [14, 16]. Предложены эффективные алгоритмы выполнения соответствующих запросов к графам [17, 18, 19]. Алгоритм выполнения запросов с ограничениями в терминах контекстно-свободных грамматик, основанный на синтаксическом анализе «сверху вниз» [32], представлен в работе [31]. В работе [15] изучены вопросы разрешимости задачи выполнения запросов к графам для конъюнктивных и булевых грамматик. Для конъюнктивных языков предложен алгоритм, строящий приближение ответа сверху [20], что делает его применимым для приближённого
решения прикладных задач. В работе [7] описан алгоритм, работающий с линейными конъюнктивными грамматиками, которые имеют не более одного нетерминального символа в каждом конъюнкте правила.
Несмотря на то, что булевы грамматики являются наиболее выразительными по сравнению с вышеупомянутыми грамматиками [13], возможность построения алгоритма, строящего приближённое решение для задачи поиска путей с ограничениями в виде булевых языков, не исследована.
4. Алгоритм
В работе [22] предложен алгоритм синтаксического анализа для булевых грамматик, основанный на матричных операциях. В данном разделе будет предложено расширение этого алгоритма для нахождения приближенного решения задачи поиска путей в ациклических графах с ограничениями в терминах булевых грамматик и использованием реляционной семантики, а также показана его корректность.
Матричные алгоритмы синтаксического анализа позволяют достичь более высокой производительности за счет использования эффективных методов перемножения матриц [21, 22]. Также за счет использования матриц возможно более компактное хранение данных. Например, в случае если входной ациклический граф является деревом, между любой парой вершин графа будет существовать всего один путь. Если же ациклический граф не является деревом, то между одной парой вершин может быть в худшем случае 0(2п) путей, поэтому хранить и обрабатывать данные для каждого пути отдельно неэффективно. Так как информация о всех путях из вершины i в вершину j хранится в одной ячейке, то с помощью конъюнкции могут быть объединены нетерминалы, соответствующие разным путям из i в j, но при этом будут объединены также нетерминалы, соответствующие одному и тому же пути, что и требуется для решения задачи. В итоге результат работы алгоритма будет содержать приближение ответа сверху.
4.1 Описание алгоритма
Рассматриваемый алгоритм решает задачу на следующих входных данных:
• помеченном ориентированном ациклическом графе D = (V,E) с п вершинами, без потери общности предположим, что п является степенью двойки и
• G = (Z, N, Р) — булевой грамматике в двоичной нормальной форме.
Результатом работы алгоритма является матрица Т; каждый её элемент T¿j содержит множество нетерминалов [А1,А2,... ,Ат}, где Ак EN, являющееся надмножеством множества нетерминалов, таких, что (i,j) Е RAk. Алгоритм использует следующие структуры данных.
• Таблица Т размером пхп, представляющая собой верхнетреугольную матрицу, где каждый элемент T¿j является множеством нетерминалов.
Пусть X Е (2N)mXl и Y Е (2N)lXn — матрицы, элементами которой являются подмножества N, а m,l,n > 1. Тогда произведением матриц X X Y будет матрица Z Е (2N)mXn, такая, что каждый её элемент Z¿j вычисляется по следующей форме:
i
ZiJ = X Yk,j
k = 1
Данное произведение можно представить в виде произведения |N|2 булевых матриц: для всех пар нетерминалов В,С Е N рассмотрим булеву матрицу ZBC, элемент Zff которой означает наличие пары (В, С) в ячейке матрицы Z¿j. При этом ZBC можно получить как произведение булевых матриц ZB и Zc. Благодаря такому переходу становится
возможным свести решение задачи к вычислению произведения булевых матриц, для осуществления которого существуют весьма эффективные алгоритмы [23, 24]. • Таблица М, каждый элемент Му которой принадлежит множеству пар нетерминалов N х N.
/* D — входной помеченный ориентированный
ациклический граф /* G — входная булева грамматика в двоичной нормальной форме Main:
12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
30
31
32
33
34
n —— число вершин в D
E —— j(i, j, a) | ребро из вершины i в j, помеченное символом a входит во множество рёбер D}
N —— множество нетерминалов грамматики G P —— множество правил грамматики G T —— пустая матрица размером n * n M —— пустая матрица размером n * n D —— TopologicalSorting(D) for each (i, j, a) e E
10: TtJ^ (Л| А^а e P}
11: compute(0, n + 1)
compute(l, m): if m - l > 4 then
compute
compute (-+—, m)
-, . ,, l+m l+m
complete
complete(l, m, l', m') if m — l = l and m < l' then
Ti,i'—f(Mhl<) else if m-l > 1 then
_ ,, l+m l+m
B — (I, —, — ,m)
B' — (I',-,-,m')
22 „ ,l+m .' l'+m'
C — (-,m,l',-)
22 „ ,, l+m ,' l'+m'.
D — (I,-,1',-)
22 ,l+m l'+m' ,,
D' —— (-,m,-,m')
22 „ ,, l+m l'+m' ,,
E — (I,-,-,m')
22
complete(C) MD—MDU (TB x Tc) complete(D) MD' — MD' U (Tc x Tw) complete(D') ME—MEU (TB x TD') ME — MEU (TD x Tw)
complete(E)
Листинг. 1. Алгоритм поиска путей в ациклических графах с ограничениями в терминах булевых грамматик
Listing. 1. Path querying on acyclic graphs using Boolean grammars
Используя значения Му и правила грамматики, из множества пар нетерминалов можно получить множество нетерминалов:
Ти = /КД
где /: 2м^ 2м для булевых грамматик определяется как
f(M) = и | Э А ^ В1С1& ...& ВтСт& —Э1Е1& ...& -йт'Ет' 6 Р: (Bt, Ct) ЕМ' и Е1) <£<£ Мк для УС, где Мк является подмножеством множества М.
Псевдокод модифицированного алгоритма Охотина приведен в листинге 1. Элементы матрицы М рассчитываются группами с помощью выше определенного произведения подматриц из таблицы Т, дающих аналогичный результат с поэлементным умножением. Схема расположения подматриц представлена на рис. 3 и 4.
0
г
1+71
\j
A В
\ A'
\
Рис. 3. Расположение подматриц для расчёта процедурой compute элементов таблицы M Fig. 3. Submatrices for calculating elements of M by «compute» procedure
0
I
.' ■ .'I
m I'
l'+m'
0
l Цр m
I'
I'' I Hi' -
\i
\4 Б V £
С ТУ
\4" В'
\ л m
Рис. 4. Расположение подматриц для расчёта процедурой complete элементов таблицы M Fig. 4. Submatrices for calculating elements of M by «complete» procedure
Алгоритм состоит из двух следующих рекурсивных процедур. • compute(l,m) - рассчитывает значения Ту для любых I < i < j < т.
• complete(l,m,r,m') - определена для I < т < Г < т' при т — I = т' — Г и т —
I без потери общности являющимися степенью двойки. Четыре входных параметра процедуры обозначают координаты подматрицы матрицы Т, содержащей все элементы Ту, где I < i < j < m и Г < j < m'.
Координаты интерпретируются следующим образом: l,m - это индексы начальной и конечной строки в таблице Т, I', т' — индексы начального и конечного столбца. Координаты обозначают пути в графе, номер начала которых находится между I и т, а конец — между I' и т'.
Так как ранее уже были вычислены Ttj для I < i < j < т и I' < i < j < т', а также Му для I < i < т и I' < j < т', то процедура complete (l,m, I', т') получает значения Ту для I < i < т и I' < j < т'.
Основные структуры данных, с которыми работает алгоритм, являются верхнетреугольными матрицами, поэтому на вершинах графа D должен быть задан линейный порядок, любое его ребро ведёт от вершины с меньшим номером к вершине с большим номером. Если D является ациклическим графом, то данного свойства легко добиться с помощью топологической сортировки графа. Например, алгоритм Тарьяна [25] позволяет осуществлять топологическую сортировку за время 0(7 + Е), где V — число вершин в графе, а Е — число рёбер.
4.2 Корректность алгоритма и оценка сложности
Как говорилось выше, результатом работы алгоритма является матрица Т, в ячейках которой будет содержаться некоторое множество нетерминалов. Покажем, что это множество будет содержать решение задачи.
Теорема 1. (Корректность алгоритма для поиска путей в ациклических графах с ограничениями в терминах булевых грамматик с использованием реляционной семантики запросов). Пусть даны помеченный ориентированный ациклический граф D = (V,E) и булева грамматика G = (Z, N, Р). Тогда для любых вершин i,j и для любого нетерминала А Е N, если (i,j) Е Ra, то А Е Ту.
Доказательство. Рассмотрим такие вершины i,j, что (i,j) Е RA и существует inj, такой, что 1(п) Е L(Ga) (т.е. существует дерево разбора для строки 1(п) и грамматики G с корнем в нетерминале А). Докажем утверждение теоремы индукцией по высоте дерева разбора строки 1(п).
База индукции. Если (i,j) - ребро графа (высота дерева разбора равна 1), то алгоритм корректен, исходя из инициализации матрицы Т (строки 9-10 листинга 1). Индукционный переход. Предположим, что утверждение верно для всех деревьев разбора высотой h. Докажем, что теорема верна для деревьев разбора высотой h + 1. Рассмотрим дерево разбора для 1(п) высотой h +1. Так как грамматика находится в двоичной нормальной форме, то у данного дерева будут поддеревья, выводящие подстроки 1(п) (возможно, пересекающиеся). По свойству топологической сортировки для всех индексов k, m этих подстрок (начала и конца соответствующих путей) выполняется неравенство i < к < m < j. Tij вычисляется как f(Mitj). My, исходя из построения алгоритма, может быть получено тремя способами, в зависимости от положения подматрицы, в которой оно задано (строки 28, 30, 32-33 листинга 1). Пусть Му — ячейка матрицы Mz. В любом из случаев М2 вычисляется как Mz U (Тх х TY). По определению произведения Тх х TY, для каждого пути из i в j будут получены все произведения нетерминалов из конъюнктов, выводящих все подстроки 1(п), такие,что путь inj разбит на две части вершиной к, такой, что i < к < j.
По индукционному предположению, то есть если (i, к) E RB, то В E Ti¡k и если (k,j) E Rc, то С E Tkj. Тогда произведение матриц Тх х TY даст все возможные пары нетерминалов {(В, С)} E M¿j для всех подстрок. После применения функции f (подбора соответствующего правила грамматики), T¿j будет содержать нетерминалы, полученные после применения правил. Тогда, исходя из правил грамматики, получим, что если (i,j) E RA, то A E T¿j (объединяем существующие поддеревья для подстрок в одно дерево). А это значит, что утверждение верно для дерева разбора высотой h + 1. □
Сложность алгоритма вычисляется так же, как и для алгоритма Охотина [22], и составляет 0(lGlBMM(n)logn), где |G| — размер входной булевой грамматики, п — число вершин в графе D, ВММ(п) — время умножения булевых матриц размера пхп.
5. Пример работы алгоритма
В данном разделе мы продемонстрируем работу предложенного алгоритма на небольшом примере.
В качестве входного графа будет использован граф, изображенный на рис. 1, а в качестве входной булевой грамматики - грамматика с рис. 2.
В строках 9-10 листинга 1 происходит инициализация таблицы Т, заполнение происходит на основании информации о рёбрах графа. Состояние Т после инициализации показано на рис. 5.
0 1 2 3 4 5 б 7
0 0 0 0 0 0 0
1 {B.D} 0 0 0 0
2 {B,D} 0 0 0 0
3 {С} 0 0 0
4 0 {С}
5 {B,D} 0
б {С}
7
Рис. 5. Таблица T после инициализации Fig. 5. The matrix T after initialization
После инициализации произойдет ряд рекурсивных вызовов процедур compute и complete. Дерево рекурсивных вызовов показано на рис. 6.
Вызовы compute(0,2), compute(2,4), compute(4,6) и compute(6,8) из-за небольшого размера задачи будут обработаны тривиально - вызовом процедур complete(0,1,1,2), complete(2,3,3,4), complete (4,5,5,6) и complete(6,1,1,8) соответственно (строка 16 листинга 1). Так как для каждого из вызовов выполняется равенство m = V для координат подматриц, в соответствующих ячейках матрицы останутся текущие множества нетерминалов без изменений.
Рис. 6. Дерево рекурсивных вызовов процедур compute и complete Fig. 6. Recursive call tree for «compute» and «complete»
На рис. 7 показаны подматрицы Т, для которых будут производиться дальнейшие вычисления.
0 1 2 3 4 5 6 7
0 (A) complete(0,2,2,4) complete(0,4,4,8)
1
2 [B,D]
3
4 (A) complete(4,6,6,8)
5
6 (0
7
Рис. 7. Подматрицы T, для которых будет вызвана процедура complete Fig. 6. Submatrices of T which will be processed by «complete».
Разберем подробнее вызов complete(0,2,2,4).
1. Сначала будут определены координаты подматриц матрицы Т (строки 21-26). В = (0,1,1,2), В' = (2,3,3,4), С = (1,2,2,3), D = (0,1,2,3), D' = (1,2,3,4).
2. Затем произойдет вызов complete(C) = complete(1,2,2,3). В результате, множество в ячейке Т12 останется неизменным, Т12 = (Л).
3. Далее вычисляем ячейку М02 таблицы M (строка 28 листинга 1). М02 = MD = MD U (Тв х Тс) = Mq,2 u (t0,i x TI2) = {(Л Л)}.
4. Выполняем complete(D) = complete(0,1,2,3). Согласно строкам 18-19 листинга 1, То,2 = f(M02) = 0, так как во входной грамматике отсутствует подходящее правило.
5. MD' = Mlj3 = MD' U (Tc х Тв0 = Mlj3 U (т1:2 х Т23) = (B,D) U ((Л) х (B,D)) = ((B),(D),(A,B),(A,D)).
6. Выполняем complete(D') = complete(1,2,3,4). Согласно строкам 18-19 листинга 1, Ti,s = f(Mlj3) = (B,D).
7. Вычисляем ячейку М03 (строки 32-33).
м0 3 = МЕ= МЕ U (Тв х TD,) = М03 U (Тол х Т13) = ((А, В), (A,D)).
М0,з = MEU (TD х Тв,) = М0з U (Т022 х Т23) = ((А, В), (A,D)) U (0 х (B,D)) = ((A,B),(A,D)).
8. Выполняем complete(E) = complete(0,1,3,4).
Т0,з = f(M0,3) = (D).
Вычисление complete(4,6,6,8) происходит аналогично. Состояние таблицы Т после окончания работы процедур complete(0,2,2,4) и complete(4,6,6,8) приведено на рис. 8.
0 1 2 3 4 5 6 7
0 0 {D} 0 0 0 0
1 {B,D} 0 0 0 0
2 {B,D} 0 0 0 0
3 {C} 0 0 0
4 W {D} {C,S}
5 {B,D} {B,S}
6 {C}
7
Рис. 8. Таблица T после окончания работы complete(0,2,2,4) и complete(4,6,6,8) Fig. 8. The matrix Tafter complete(0,2,2,4) и complete(4,6,6,8)
Теперь всё готово для работы процедуры complete(0,4,4,8). Разбиение Т на подматрицы показано на рисунке 9, синим цветом выделены матрицы В (левый верхний угол) и матрица В' (правый нижний угол).
0 1 2 3 4 5 6 7
0 0 {D} D E
1 {B,D}
2 {B,D} C D
3
4 {D} {C,S}
5 {B,D} {B,S}
6 {Q
7
Рис. 9. Разбиение на подматрицы таблицы T для вычисления complete(0,4,4,8) Fig. 9. Partition of the matrix T for complete(0,4,4,8)
После определения координат подматриц будет вызвана процедура complete (С) = complete(2,4,4,6). Расчёт элементов Тс производится аналогично ранее описанным расчетам для матриц 2 х 2, поэтому сразу приведем результат:
_ ({B.S} 0
'г
_ ({B,S} 0\ ( {С} 0J.
{С} 0/
Далее вычисляем элементы оставшихся подматриц. , Md= Mdu(T»xTc)= (0 ™D)) х 00) =
/ {(D,C)} 0\
({(A,B),(A,S),(B,C),(D,C)} 0).
После complete(D) = complete(0,2,4,6) TD = 0).
2.
K{(A,B),(A,S),(B,C),(D,C)} 0)
plete(0
M =M U(T XT 0= ({ß,5} 0) х ( {D} {c,5}) =
MD' = MD'U(1CX1B')= ( {C} 0)x ({B D} {B S}) =
i{(B, D),(S,D)} {(В, С), (B, S), (S, C), (S, S)}\ ( {(S,D)} {(C,C),(C,S)} ).
После complete(D') = complete(2,4,6,8) TD'= (0 3. Теперь вычисляем ME = ME U (TB xTD') = 222
_ ( 0 {D} ) (0 {В})_(0 Ф ) ({Л} {В, D}) Х (0 0) (0 i(A,B)}J-Затем МЕ = MEU (TD х Тв,) = _(0 0 {s} ( {D} {С,5}\_
(0 {(A,B)})U({B,S} 0)Х ({B,D} {B,S}) ( {(S,D)} {(S, С), (S, S)} \
({(B, D), (S, D)} {(A В), (В, C), (B,S), (S, C), (S, S)})'
После complete(E) = complete(0,2,6,8) TE = (^ {ф})-
Финальное состояние таблицы Т представлено на рис. 10.
0 1 2 3 4 5 6 7
0 0 {D} {S} 0 0 0
1 {B,D} {В, S} 0 0 {В}
2 {B,D} {В, S} 0 0 {В}
3 {С} 0 0 0
4 W {D} {С, S}
5 {B,D} {В, S}
6 {С}
7
Рис. 10. Результирующее состояние таблицы T Fig. 10. Final state of the matrix T
Данный пример демонстрирует тот факт, что алгоритм не всегда находит точное решение. Например, согласно таблице на рисунке 10, между вершинами 4 и 7 (ячейка Т47) проходит путь, конкатенация меток которого составляет слово из языка L(GS). На самом деле, между вершинами 4 и 7 проходят два пути: первый путь — ребро графа, помеченное символом "с", а второй путь вида 4 ^ 5 ^ 6 ^ 7, метки рёбер которого составляют строку "abc". И если нетерминал С Е Т47 действительно выводит символ "с", то S Е Т47 не выводит строку "abc" по причине того, что она выводится конъюнктом AB, отрицание которого есть в правиле S ^ DC&—AB. Это получается из-за того, что, хотя пара (А, В) и присутствовала в множестве нетерминалов {(A,B),(D,C)} в ячейке М47, функция /, которая рассматривает все подмножества данного множества, на подмножестве {(D, С)} вернёт нетерминал S. Несмотря на то, что стратегия рассматривания отдельных подмножеств пар нетерминалов дает лишние ответы, она гарантирует наличие в результатах настоящего ответа на задачу. Продемонстрируем это на следующем примере.
Рассмотрим пару вершин (0, 4) в графе на рис. 1. Между этой парой вершин есть два пути: путь 0 ^ 1 ^ 3 ^ 4, метки которого составляют строку «abc» и путь 0 ^ 1 ^ 2 ^ 3 ^ 4, метки которого составляют строку «aabc». Заметим, что «abc» Е L(GAB), L(GDC), а "aabc" Е L(GDC), поэтому (0, 4) Е Rs. Во время работы алгоритма, в ячейке М04 окажется множество {(A,B),(D,C)}. Если бы мы рассматривали всё множество сразу, то из-за отрицания (А, В) не нашлось бы подходящего правила, и тогда ячейка Т0 4 в результате содержала бы пустое множество. Но, как показано выше, в графе между парой вершин 0 и 4 есть уникальный путь, слово из меток рёбер которого выводится конъюнктом DC, а конъюнкт AB на самом деле выводит слово из меток рёбер другого пути между этими же вершинами. Именно поэтому, чтобы рассмотреть все возможные случаи и не отсечь настоящее решение, алгоритм рассматривает все подмножества, что дает аппроксимацию ответа сверху.
6. Заключение
В данной работе был предложен алгоритм, находящий приближённое решение задачи поиска путей в ациклических графах с ограничениями в терминах булевых грамматик и использованием реляционной семантики запросов. Была показана применимость алгоритма для поиска приближённого решения данной задачи. Благодаря тому, что предложенный алгоритм находит приближённое решение задачи, была получена более оптимальная асимптотика по сравнению с наивным точным алгоритмом, которому необходимо было бы рассмотреть все пути в графе, число которых экспоненциально от количества вершин в графе. Так как предложенный алгоритм приближает решение сверху, на полученном решении возможно запустить точный алгоритм, который найдет точное решение за гораздо меньшее время. Также за счёт ограничения на тип входного графа и использования матричных операций, алгоритм является более асимптотически оптимальным, чем приближённый наивный итерационный алгоритм.
Определим несколько направлений для будущих исследований. Так как алгоритм работает только с ациклическими графами, открытым остается вопрос, возможно ли модифицировать алгоритм для работы с произвольными графами и сохранением такой же асимптотики. Также интерес представляет вопрос возможности эффективного преобразования произвольного входного графа в форму, позволяющую обработку данным алгоритмом, например, какой-либо вариант декомпозиции графа.
Список литературы / References
[1]. Barcelo Baeza P. Querying graph databases. In Proc. of the 32nd ACM SIGMOD-SIGACT-SIGAI symposium on Principles of database systems (PODS '13), 2013, pp. 175-188.
[2]. Mendelzon A., Wood P. Finding Regular Simple Paths in Graph Databases. SIAM Journal on Computing, vol. 24, № 6, 1995, pp. 1235-1258.
[3]. Anderson J. W. et al. Quantifying variances in comparative RNA secondary structure prediction. BMC bioinformatics, vol. 14, 2013.
[4]. Chaudhary A., Faisal A. Role of graph databases in social networks. 2016, available at: https://www.researchgate.net/publication/304462174_Role_of_graph_databases_in_social_networks, accessed 02.06.2019.
[5]. Warchal, L. Using Neo4j graph database in social network analysis. Studia Informatica, vol. 33, № 2A, 2012, pp. 271-279.
[6]. Reps T. Program analysis via graph reachability. In Proc. of the 1997 international symposium on Logic programming (ILPS '97), 1997, pp. 5-19.
[7]. Zhang Q., Su Z. Context-sensitive data-dependence analysis via linear conjunctive language reachability. In Proc. of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages, 2017, pp. 344-358.
[8]. Yuan H., Eugster P. An Efficient Algorithm for Solving the Dyck-CFL Reachability Problem on Trees. In Proc. of the 18th European Symposium on Programming Languages and Systems: Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2009 (ESOP '09), 2009, pp. 175-189.
[9]. Neo4j's Graph Query Language: An Introduction to Cypher. Available at: https://neo4j.com/developer/cypher-query-language/, accessed 02.06.2019.
[10]. Rodriguez M. A. The gremlin graph traversal machine and language (invited talk). In Proc. of the 15th Symposium on Database Programming Languages, 2015, pp. 1 -10.
[11]. Eric Prud'hommeaux, Andy Seaborne (eds). SPARQL query language for RDF. W3C Recommendation 15 January 2008. Available at: https://www.w3.org/TR/2008/REC-rdf-sparql-query-20080115/, accessed 02.06.2019.
[12]. Okhotin A. Conjunctive grammars. Journal of Automata, Languages and Combinatorics, vol. 6, № 4, 2001, pp. 519-535.
[13]. Okhotin A. Boolean grammars. Information and Computation, vol. 194, issue 1, 2004, pp. 19-48.
[14]. Hellings J. Querying for Paths in Graphs using Context-Free Path Queries. CoRR abs/1502.02242, 2015.
[15]. Hellings J. Conjunctive context-free path queries. In Proc. of the International Conference on Database Theory (ICDT'14), 2014, pp.119-130.
[16]. Sevon P., Eronen L. Subgraph queries by context-free grammars. Journal of Integrative Bioinformatics, vol. 5, № 2, 2008.
[17]. Zhang X. et al. Context-free path queries on RDF graphs. In Proc. of the International Semantic Web Conference, 2016, pp. 632-648.
[18]. Grigorev S., Ragozina A. Context-free path querying with structural representation of result. In Proc. of the 13th Central & Eastern European Software Engineering Conference in Russia (CEE-SECR '17), article 10.
[19]. Azimov R.Sh., Grigorev S.V. Context-Free Path Querying by Matrix Multiplication. CoRR, abs/1707.01007, 2017.
[20]. Азимов Р.Ш., Григорьев С.В. Синтаксический анализ графов с использованием конъюнктивных грамматик. Труды ИСП РАН, том 30, вып. 2, 2018 г., стр. 149-166 / Azimov R.Sh., Grigorev S.V. Path querying using conjunctive grammars. Trudy ISP RAN/Proc. ISP RAS, vol. 30, issue. 2, 2018, pp. 149166 (in Russian). DOI: 10.15514/ISPRAS-2018-30(2)-8.
[21]. Valiant L.G. General context-free recognition in less than cubic time. Journal of computer and system sciences, vol. 10, № 2, 1975, pp. 308-315.
[22]. Okhotin A. Parsing by matrix multiplication generalized to Boolean grammars. Theoretical Computer Science, vol. 516, 2014, pp. 101-120.
[23]. Арлазаров В.Л., Диниц Е.А., Кронрод М.А., Фараджев И.А. Об экономном построении транзитивного замыкания ориентированного графа. Доклады АН СССР, том 194, № 3, 1970, pp. 487-488 / Arlazarov V.L., Dinitz Y.A., Kronrod M.A., Faradzhev I.A. On economical construction of the transitive closure of an oriented graph. Doklady Akademii Nauk SSSR, vol. 194, № 3, 1970, pp. 487-488 (in Russian).
[24]. Vassilevska Williams V. Multiplying matrices faster than Coppersmith-Winograd. In Proc. of the 44th Symposium on Theory of Computing (ST0C2012), 2012, pp. 887-898.
[25]. Tarjan R.E. Depth-first search and linear graph algorithms. In Proc. of the 12th Annual Symposium on Switching and Automata Theory (SWAT 1971), 1971, pp. 114-121.
[26]. Koschmieder André, Leser Ulf. Regular Path Queries on Large Graphs. In Proc. of the 24 th International Conference on Scientific and Statistical Database Management (SSDBM'12), 2012, pp. 177-194.
[27]. Reutter Juan L., Romero Miguel, Vardi Moshe Y. Regular Queries on Graph Databases. Theory of Computing Systems, vol. 61, № 1, 2017, pp. 31-83.
[28]. Lu C., Yu J. X., Li R., Wei H. Exploring Hierarchies in Online Social Networks. IEEE Transactions on Knowledge and Data Engineering, vol. 28, № 8, 2016, pp. 2086-2100.
[29]. Sridharan, M., Gopan, D., Shan, L., Bodik, R. Demand-driven points-to analysis for Java. In Proc. of the 20th Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA2005), 2005, pp. 59-76.
[30]. Терехов А.Н., Эрлих Л.А., Терехов А.А. История и архитектура проекта RescueWare. В сб. «Автоматизированный реинжиниринг программ», Издательство Санкт-Петербургского государственного университета, 2000 г., стр. 7-19 / Terekhov A.N., Erlikh L.A., Terekhov A.A. History and architecture of a project RescueWare. In «Automated software reengineering», Publishing House of St. Petersburg State University, 2000, pp. 7-19 (in Russian).
[31]. Medeiros Ciro M., Musicante Martin A., Costa Umberto S. Efficient evaluation of context-free path queries for graph databases. In Proc. of the 33rd Annual ACM Symposium on Applied Computing (SAC '18), 2018, pp. 1230-1237.
[32]. Rosenkrantz D.J., Stearns R.E. Properties of deterministic top-down grammars. Information and Control, vol. 17, № 3, 1970, pp. 226-256.
Информация об авторах / Information about authors
Екатерина Николаевна ШЕМЕТОВА получила степень магистра в области разработки программного обеспечения в университете ИТМО. Области научных интересов: теория формальных языков и её приложения, статический анализ кода, информационная безопасность, теория сложности вычислений.
Ekaterina Nikolaevna SHEMETOVA got master's degree in Software Engineering from ITMO University. Her research interests include formal language theory and applications, static code analysis, information security and computational complexity theory.
Семён Вячеславович ГРИГОРЬЕВ, кандидат физико-математических наук, доцент кафедры информатики СПбГУ. Области научных интересов: теория формальных языков и её приложения, графовые базы данных, статический анализ кода, параллельные вычисления.
Semyon Vyatcheslavovitch GRIGOREV is PhD in Phisical and Mathematical sciences, associated professor of the Department of Informatics at St Petersburg University. His research interests include formal language theory and applications, graph databases, static code analysis and parallel computing.