Научная статья на тему 'Хранение и обработка графа социальных сетей'

Хранение и обработка графа социальных сетей Текст научной статьи по специальности «Математика»

CC BY
433
78
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ХРАНИЛИЩЕ ГРАФОВ / АЛГОРИТМЫ ТЕОРИИ ГРАФОВ / БОЛЬШИЕ ДАННЫЕ / GRAPH WAREHOUSE / GRAPH ALGORITHMS / BIG DATA

Аннотация научной статьи по математике, автор научной работы — Поляков Игорь Викторович, Чеповский Александр Андреевич, Чеповский Андрей Михайлович

Представлена специализированная структура данных, предназначенная для хранения и выполнения различных операций с графами социальных сетей больших объемов. Предложенная структура хранения ориентирована на поддержку операций пополнения и выгрузки подграфов и поиска кратчайших путей между двумя группами вершин.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

SOCIAL NETWORKS STORING AND PROCESSING

In this paper special data structure for big social graph storing and operating is presented. We discuss mainly graph paths searching, obtaining subgrapths and addition of new edges and vertices.

Текст научной работы на тему «Хранение и обработка графа социальных сетей»

УДК 004.421.2:519.178

И. В. Поляков, А. А. Чеповский, А. М. Чеповский

Национальный исследовательский университет Высшая школа экономики ул. Мясницкая, 20, Москва, 101000, Россия

E-mail: achepovskiy@hse.ru

ХРАНЕНИЕ И ОБРАБОТКА ГРАФА СОЦИАЛЬНЫХ СЕТЕЙ

Представлена специализированная структура данных, предназначенная для хранения и выполнения различных операций с графами социальных сетей больших объемов. Предложенная структура хранения ориентирована на поддержку операций пополнения и выгрузки подграфов и поиска кратчайших путей между двумя группами вершин.

Ключевые слова: хранилище графов, алгоритмы теории графов, большие данные.

Введение

Специализированные базы данных для хранения и обработки графов получили широкое развитие в последние годы. Они имеют обширную область применения от химических и биологических задач до задач хранения и обработки графов социальных сетей. Их преимуществом по сравнению с реляционными базами данных является поддержка более сложных операций в рамках моделей исследуемых предметных областей.

Каждая такая база данных имеет свои особенности и свой язык запросов. Сравнительную характеристику наиболее популярных баз данных для хранения и обработки графов можно найти в [1-4]. Отличия между ними выражаются главным образом в оптимизации поддержки различных наборов алгоритмов обработки графов. Так, Neo4j ориентирована на максимально быстрый обход графа и поиск путей, а HyperGraphDB - база с поддержкой хранения гиперграфов, Sones поддерживает хранение взвешенных графов и гиперграфов.

В силу того что большинство баз данных для хранения и обработки графов имеют широкую специализацию и поддерживают большой диапазон различных операций, для конкретных предметных областей и задач могут быть построены более эффективные решения.

Постановка задачи

Обозначим множество всех потенциальных узлов графа Vm. Пусть Em = Vm х Vm - множество всех возможных ориентированных ребер. Под графом будем понимать произвольную пару множеств {V, E}, V с Vm, E с Em. На практике каждому хранимому графу сопоставляется также некоторая таблица атрибутов. Атрибуты вершины v будем обозначать через Ai (v), i = 1,...,M, атрибуты ребра e — Ai (e), i = 1,...,M. Предполагается, что каждая функция Ai отображает множества всех возможных вершин и ребер в пространство значений X¡ соответствующего атрибута. Все такие пространства должны содержать специальный эле-

Поляков И. В., Чеповский А. А., Чеповский А. М. Хранение и обработка графа социальных сетей // Вестн. Но-восиб. гос. ун-та. Серия: Информационные технологии. 2013. Т. 11, вып. 4. С. 77-83.

ISSN 1818-7900. Вестник НГУ. Серия: Информационные технологии. 2013. Том 11, выпуск 4 © И. В. Поляков, А. А. Чеповский, А. М. Чеповский, 2013

мент NULL. Предполагается, что Af (v) = NULL, если для данной вершины i-й атрибут не

определен. Аналогичное соглашение выполняется для ребер.

На каждом пространстве Xi определена некоторая хэш-функция H, отображающая элементы данного пространства на множество натуральных чисел. Отметим, что данная таблица не является фиксированной и может динамически изменяться на протяжении всего времени существования графа.

Для каждой вершины v под E (v) будем понимать все ребра, инцидентные данной вершине. Для каждой связи l через vt (l), v2 (l) обозначим те вершины, которые она соединяет.

Сконструируем такую модель хранения графа, которая ориентирована главным образом на поддержку операций пополнения, объединения и пересечения графов, а также поиска кратчайших путей между двумя группами вершин. Структуры данных должны быть рассчитаны на работу с графами, содержащими до 100 миллионов вершин и нескольких миллиардов связей, поэтому хранение графа в виде матрицы смежности не представляется возможным. За основу взят способ хранения графа в виде списков смежности.

Структура хранилища

В качестве базовой структуры хранилища используется специализированная файловая система, которая реализуется внутри некоторого файла стандартной файловой системы компьютера, поэтому под логическим файлом будем понимать файл, принадлежащий данной специализированной системе. Предполагается, что каждый логический файл состоит из некоторых записей переменной длины.

Поддерживаются следующие операции:

• адресация логических файлов целыми числами;

• добавление записи в конец логического файла;

• удаление логического файла целиком;

• чтение всех записей логического файла с произвольной позиции в прямом и обратном направлениях.

Таким образом, система состоит из файлов, адресуемых числами 1,..., N, типичное значение для N - порядка 100 000. При этом i-й файл состоит из блоков {В.. j, j = 1,...,Ci фиксированной длины, размером порядка 300 Кб, объединенных в двунаправленный список. В оперативной памяти для каждого логического файла хранится так называемая карта блоков

М.j, j = 1,...,Ci, представляющая собой двунаправленный список, который хранит смещения блоков файла. Также элемент М. этой карты содержит в себе битовую маску фиксированной длины L (обычно порядка 32 000), предназначенную для сохранения значений некоторых выбранных хэш-функций, вычисляемых от каждой записи r, добавленной в блок В..

При этом в битовой маске устанавливаются биты с номерами H (At (r)) %L. Это позволяет

более эффективно выполнять операцию чтения файла с условием фильтрации по атрибутам, пропуская некоторые блоки, в которых нет записей, содержащих данные атрибуты.

В зависимости от режима использования в памяти может осуществляться буферизация данных, добавляемых в конец файла. Это позволяет снижать нагрузку на дисковую подсистему в процессе активной записи данных в конец файла. При необходимости данные в файлах могут сжиматься одним из стандартных алгоритмов. Сжатие происходит при заполнении буфера. Единицей сжатия в таком случае является один заполненный буфер. Главные преимущества от использования собственной файловой системы состоят в следующем:

1) отсутствие системных вызовов при работе с собственной файловой системой;

2) в традиционных файловых системах имеется существенное ограничение на количество одновременно открытых файлов, которое отсутствует при использовании собственной файловой системы;

3) управление буферизацией и хранением данных прозрачно и не зависит от особенностей операционной системы;

4) отсутствие сложной системы адресации (структуры каталогов) и лишних механизмов (права доступа) приводит к отсутствию дополнительных накладных расходов на организацию хранения данных.

Идентификация вершин

и хранение списков смежности

Все добавляемые в граф вершины идентифицируются возрастающими натуральными числами. Атрибуты вершин складываются в некоторый файл по порядку. Если атрибуты очередной вершины требуют для своего хранения байт, то для них резервируется 1,2 • S + С байт, где С - параметр алгоритма, который выбирается в зависимости от параметров атрибутов того графа, который планируется хранить. Наличие дополнительного места позволяет в дальнейшем изменять атрибуты некоторой вершины, в том числе путем добавления новых атрибутов. Если свободного места недостаточно, для модифицируемой вершины выделяется еще одна запись, и обе записи объединяются в двунаправленный список. В дальнейшем возможно выделение дополнительных записей. При этом возникает некоторая фрагментация, которая может быть устранена путем перестроения файла атрибутов вершин, что потребует полной остановки работы хранилища.

Для каждой вершины V в оперативной памяти выделяется дескриптор V(у) фиксированного размера, содержащий указатель на первую запись в файле атрибутов, соответствующую данной вершине.

Каждой вершине V сопоставлен один логический файл Е (у), в котором хранятся записи, описывающие связи этой вершины. При этом один логический файл может быть сопоставлен нескольким вершинам, т. е. равенство Е(у1 ) = Е(у2) возможно для двух несовпадающих вершин у1 и у2. Номер данного файла хранится в дескрипторе вершины. Также в дескрипторе хранятся счетчик количества связей данной вершины и счетчик количества выполненных операций кластеризации для данной вершины. В дескрипторе каждой вершины хранится количество различных вершин, смежных с ней, привязанных к тому же логическому файлу. Это значение пересчитывается в момент проведения очередной процедуры кластеризации для данной вершины.

Каждая связь I, добавляемая в хранилище, формирует некоторую запись, которая содержит идентификаторы двух соединяемых вершин у1 (/), у2 (/), два бита, характеризующие ее

направленность (связь может быть ненаправленной), а также все атрибуты связи Ai (I).

Сформированная запись записывается впоследствии в файлы с номерами Е(у1 (I)),

Е (у 2 (I)). Кроме того, каждой связи присваивается некоторый уникальный идентификатор

id (/), который также добавляется в виде отдельного поля к добавляемой записи.

После добавления некоторой связи I может возникнуть необходимость в ее полном удалении или изменении содержащихся в ней атрибутов. Соответствующие операции реализованы в хранилище. В случае изменения атрибутов формируется запись, описывающая новую версию связи, при этом новая запись содержит тот же самый идентификатор связи id (I). Затем

эта запись добавляется в файлы Е (у1 (/)), Е(у2 (/)). В случае полного удаления связи формируется служебная запись с флагом удаления, с идентификатором id (I), которая также добавляется в файлы Е (у1 (I)), Е (у2 (I)).

Таким образом, чтение списка смежности вершины V требует чтения логического файла Е (у) в обратном порядке с последующей фильтрацией всех прочитанных записей по полю у1 (I). Кроме того, для одного и того же идентификатора связи в полученном списке может

быть несколько записей. Это происходит в случае выполнения операций изменения или удаления связей. Если первой идет служебная связь с флагом удаления, то все записи с заданным идентификатором должны быть выброшены из финального списка смежности, в противном случае в финальный список смежности следует поместить только самую первую запись (при чтении в обратном порядке).

Если необходимо привязать некоторую вершину к другому логическому файлу, следует сначала скопировать список смежности в другой логический файл, предварительно прочитав его. Затем необходимо удалить все записи о данной вершине из старого логического файла. Это можно осуществить путем добавления специальной служебной записи, содержащей флаг удаления всех записей данной вершины, записанных ранее в логический файл. После этого нужно прописать другой номер логического файла в дескрипторе вершины D(у). Такой

способ перемещения не требует чрезмерно больших затрат, однако приводит к некоторому дублированию данных, которое в дальнейшем может быть устранено проведением процедуры дефрагментации того логического файла, откуда был удален список смежности.

Индексы по атрибутам вершин

Для более быстрого выполнения операций поиска вершин по конкретным значениям атрибутов в хранилище присутствует специализированный индекс по атрибутам вершин. Данный индекс также использует собственную копию специализированной файловой системы, описанной выше. Система содержит K логических файлов. При добавлении вершины V с атрибутами А (у), 7 = 1,...,M, для 7-го атрибута формируется запись, содержащая в качестве полей:

1) значение хэш-функции на данном атрибуте Н (А1 (у));

2) номер атрибута 7;

3) идентификатор вершины id (у).

Данная запись заносится в логический файл с номером Н (А{ (у)) % К. В дальнейшем это позволяет более эффективно искать вершины, у которых значение 7-го атрибута равно А. Для этого необходимо загрузить логический файл с номером Н (А) % К и отфильтровать полученное множество записей по первым двум полям. Извлекая идентификаторы вершин из полученных записей, можно сформировать множество вершин, заведомо содержащее все искомые. Однако из-за коллизий хэш-функции там могут оказаться вершины, для которых значение 7-го атрибута отличается от А. Для фильтрации таких вершин необходимо для каждой полученной вершины загрузить ее атрибуты из файла атрибутов вершин. Это потребует одной дисковой операции на каждую проверяемую вершину, что не всегда является приемлемым. Альтернативой данному подходу является хранение непосредственных значений атрибутов вместо значений хэш-функции в записях индекса в качестве первого поля. Данный способ не требует фильтрации, однако он способен увеличить объем индекса в несколько раз.

Операции модификации атрибутов уже добавленной вершины требуют внесения соответствующих изменений в индекс.

В случае добавления новых атрибутов следует добавить в индекс дополнительную запись на каждый атрибут, при удалении некоторого атрибута необходимо добавить в индекс запись с флагом удаления. При последующем чтении записей, соответствующих некоторому атрибуту, следует читать полученный список с конца. Встретив запись об удалении некоторого атрибута у вершины с некоторым идентификатором, мы должны игнорировать предыдущие записи о его наличии у вершины с тем же идентификатором. Операция изменения атрибута сводится к последовательному применению операций удаления и добавления атрибута.

Поиск путей и кластеризация списков смежности

Рассмотрим задачу нахождения пути между множествами вершин и Б2 за минимальное время. При этом желательно найти путь как можно меньшей длины. Обозначим через

V1 множество вершин, ассоциированных с ^м логическим файлом. Количество связей между вершинами из данного множества намного меньше общего числа связей в графе (при количестве логических файлов, превышающем несколько сотен тысяч). Поэтому разумно требовать, чтобы ограничение графа на множество Vi могло быть полностью размещено в оперативной памяти. В противном случае логический файл можно разбить на несколько файлов меньшего размера. Отметим также, что такого рода графы могут быть построены за один проход по логическому файлу.

Предлагается следующий алгоритм, решающий поставленную задачу поиска путей. На каждом шаге предлагаемого алгоритма образуются множества Б^, 52, а также некоторые структуры данных О^, 02,, сопоставляющие каждой вершине 5 е некоторую вершину предок О^ (5). В качестве такого рода структур могут быть использованы обычные массивы. При этом Б^. = Б^ и 01 (5) = 5, что означает, что все вершины из БЦ не имеют предка.

Опишем п-й шаг алгоритма.

1. В случае если множества 51п, Б2, пересекаются - кратчайший путь найден, так как при наличии общей точки с помощью структур 01п, О^ можно построить путь от нее до мно-

пи пи

жеств Б1 , Б2 соответственно.

2. Проверяем существование таких i, для которых Б1п П У{ и Б^ П V одновременно не пусты, и при этом одно из множеств Б1п П V, Б2, П V должно быть строго больше, чем Б1п 1 П V и Б2Г1 ПV соответственно.

3. Для каждого найденного i загружаем 7-й логический файл в память, строим по нему граф Gi и ищем в нем кратчайшие пути между множествами Б1п П V, Б2, П Vi с помощью обычного алгоритма поиска в ширину. Каждый такой путь очевидным образом дает некоторый путь между множествами Б1п, Б^ в исходном графе, который с помощью структур 01п, О?, продолжается до некоторого пути между Б1 и Б2.

Если такие пути существуют, то добавляем их в список найденных путей. Полученные таким образом пути необязательно являются кратчайшими, поэтому алгоритм не может быть остановлен в случае их успешного обнаружения.

4. Добавляем в множество Б1п+1 все вершины из множества Б1п и смежные с ними вершины. Для каждой вершины, не содержащейся в Б1п, запоминаем ту вершину, из которой она была достигнута в структуре 01п+1. Таким же образом строим множество Б2п+1, после чего снова переходим к пункту 1.

Отметим, что по мере нахождения некоторого набора путей они могут предоставляться пользователю, который может принять решение о прекращении дальнейшей работы алгоритма.

Точные оценки количества операций, требуемых данным алгоритмом, существенным образом зависят от того, насколько плотно связанными являются графы Gi. Идеальным вариантом являются полные графы, в которых каждая пара вершин связана между собой. Отметим, что полноту графов Gi можно существенно повысить на этапе построения графа с помощью некоторого процесса, называемого далее кластеризацией.

Кластеризация проводится на этапе построения графа. В процессе нее происходит перемещение списка смежности данной вершины в другой логический файл. Целью данной операции является увеличение связности графов Gi.

При добавлении вершины к ней автоматически привязывается наименее загруженный логический файл. Это происходит потому, что без наличия каких-либо связей невозможно определить тот файл, с вершинами которого данная вершина имеет максимальное число связей. В дальнейшем по мере накопления связей происходит перемещение всего списка смежности в тот логический файл, с которым у данной вершины имеется максимальное число связей.

Для определения моментов переноса определяются некоторые пороговые значения аы = 2. При достижении счетчиком количества данной вершины очередного порогового значения список смежности этой вершины перемещается в наиболее подходящий логический файл. Для этого он должен быть полностью прочитан. В процессе чтения вычисляется количество уникальных вершин в каждом логическом файле, смежным с данным. Выбирается файл с максимальным значением этого числа. Именно в этот файл и перемещается список смежностей вершины. Счетчик количества уникальных связей для этого логического файла запоминается в дескрипторе вершины.

Операции объединения и пересечения

Необходимо объединить хранилища G1 = (У|, Е1) и G2 = (У2, Е2) в результирующее хранилище G3 = (У3, Е3). При этом задаются некоторые предикаты Р1, Р2 на множестве пар У1 х У2 и Е1 х Е2, определяющие условия, при выполнении которых должны отождествляться вершины и связи из разных графов. При отождествлении вершин и связей, происходит объединение списков атрибутов с последующим устранением дубликатов.

Установим следующие два требования к хранилищам, необходимые для успешного выполнения операции объединения:

1) списки вершин обоих хранилищ со всеми их атрибутами должны одновременно помещаться в оперативной памяти;

2) объединенное хранилище не должно содержать вершины, все связи которой вместе с атрибутами не помещались бы в оперативную память.

Алгоритм объединения двух хранилищ включает несколько этапов.

1. Сначала необходимо объединить множества вершин У1 и У2 и поместить их в результирующее хранилище. Для этого оба списка помещаются в оперативную память, после чего производится их объединение в единый список с помощью предиката р. При объединении нескольких вершин в одну объединяются списки их атрибутов. Список У1^ У2 заносится в результирующее хранилище. При этом формируются два массива 11, 12, определяющие соответствие между индексами вершин объединяемых хранилищ и их индексами в результирующем хранилище.

2. Необходимо прочитать все логические файлы каждого из объединяемых хранилищ и добавить каждую прочитанную запись о наличии связи в новое хранилище. Для каждой прочитанной связи будут известны индексы ее вершин в соответствующем хранилище . Индексы тех вершин, в которые они перешли, могут быть вычислены с помощью массивов 11, 12. Таким образом, эта связь может быть добавлена в хранилище G3.

3. Производится удаление дубликатов связей в хранилище G3. Для этого необходимо по очереди прочитать в оперативную память каждый логический файл хранилища G3, отсортировать все связи по полям у1 (/), у2 (I). После этого следует попарно сравнить все связи с совпадающими значениями данных полей с помощью предиката Р2. Для каждой группы совпавших связей следует оставить только один экземпляр.

После данной процедуры необходимо перезаписать логический файл. Если какой-либо логический файл не помещается в оперативную память, он разбивается на несколько файлов меньшего размера.

Пересечение графов выполняется схожим с объединением способом. За исключением того, что в список вершин результирующего хранилища попадают только те вершины, которые присутствуют в обоих хранилищах G1 и G2. При этом в хранилище 03 попадают только связи I, для которых вершины у1 (I), у2 (I) попали в G3. Таким образом, после пересечения

графов по вершинам происходит их объединение по связям с последующим устранением дубликатов. Требования к графам, участвующим в данной операции, аналогичны требованиям операции объединения.

Заключение

Предложена модель хранения графов и необходимые для ее реализации структуры данных и базовые алгоритмы. Эта модель ориентирована на хранение и операции с графами, размеры которых превышают объемы оперативной памяти. При этом количество хранимых ребер потенциально ограничено лишь объемом наличного дискового пространства.

Рассматриваемый объем данных делает невозможным использование стандартного алгоритма поиска в ширину для нахождения кратчайшего пути.

Более сложные алгоритмы предполагают создание и поддержание дополнительных структур данных, размер которых потенциально может превосходить размер самого графа в несколько раз.

Предложенная схема кластеризации списков смежности не использует дополнительных структур данных, позволяя при этом значительно сократить количество дисковых операций, требуемых для нахождения какого-либо пути между двумя группами вершин, по сравнению с тривиальным алгоритмом поиска в ширину.

Данные выводы подтверждены вычислительными экспериментами авторов на графах, имеющих порядка 100 миллионов вершин и нескольких миллиардов связей.

Список литературы

1. Angles R. A Comparison of Current Graph Database Models // Proceedings of the 2012 IEEE 28th International Conference on Data Engineering Workshops, ICDEW '12, IEEE Computer Society. Washington, DC, USA, 2012. P. 171-177.

2. Angles R., Gutierrez C. Survey of Graph Database Models // ACM Comput. Surv. 2008. Vol. 40 (1). P. 1:1-1:39.

3. Shalini Batra, Charu Tyagi. Comparative Analysis of Relational and Graph Databases // International Journal of Soft Computing and Engineering (IJSCE). 2012. Vol. 2. Is. 2. Р. 509-512.

4. Shrinivas S. G. et al. Applications of Graph Theory in Computer Science an Overview // International Journal of Engineering Science and Technology. 2010. Vol. 9. Р. 4610-4621.

Материал поступил в редколлегию 18.10.2013

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

I. V. Polyakov, A. A. Chepovskiy, A. M. Chepovskiy SOCIAL NETWORKS STORING AND PROCESSING

In this paper special data structure for big social graph storing and operating is presented. We discuss mainly graph paths searching, obtaining subgrapths and addition of new edges and vertices.

Keywords: graph warehouse, graph algorithms, big data.

i Надоели баннеры? Вы всегда можете отключить рекламу.