Граф Базы данных также обсуждались в моей предыдущей статье о базах данных NoSQL. Два других ценных исследования о графовых базах данных — это публикация в ReadWriteWeb и страница в DBPedias . В то время как они видны сверху с концептуальной и каркасной сторон соответственно, здесь я в основном начинаю с нижнего вида, рассматривая их манипуляции и функции. Кроме того, эта запись охватывает больше продуктов, чем их.
Этот пост был изначально написан Джаспер Пей Ли
В теории графов простой граф представляет собой набор узлов и ребер. Хотя это определение является фундаментальным, графовые базы данных обычно добавляют типы и атрибуты на узлах и ребрах, чтобы сделать их более наглядными и практичными в использовании. По крайней мере, ожидается, что графовые базы данных будут поддерживать быстрый обход — вот почему мы не просто используем табличные базы данных, такие как HBase или Cassandra, для хранения всех ребер (операция объединения стоит дорого).
В предыдущей записи мы говорим, что графовые базы данных являются одной из четырех основных категорий баз данных NoSQL. Также в категории хранилищ графиков представлены семь продуктов: Neo4J , Infinite Graph , DEX , InfoGrid , HyperGraphDB , Trinity и AllegroGraph . Мы подробно обсудим каждый из них в этой статье, главным образом с точки зрения того, как использовать их в качестве программиста на Java.
1. Neo4J (технология Neo)
Neo4J может быть самой популярной графовой базой данных. Из названия мы знаем, что Neo4J специально разработан для приложений Java, но также поддерживает Python . Neo4J — это проект с открытым исходным кодом, доступный в версии GPLv3 Community, с расширенными версиями и версиями Enterprise, доступными как по AGPLv3, так и по коммерческой лицензии.
Модель графика в Neo4J показана на рисунке 1. Простыми словами:
- Свойство (пара ключ-значение) может быть добавлено как к узлу, так и к ребру;
- Только ребра могут быть связаны с типом, например, «ЗНАЕТ»;
- Края могут быть указаны как направленные или ненаправленные.
Учитывая имя узла, если вы хотите найти этот узел в графе, то вам нужна помощь индекса. Neo4J использует следующий механизм индекса: супер referenceNode соединяет все узлы специальным типом ребра «REFERENCE». Это фактически позволяет вам создавать несколько индексов, если вы различаете их по разным типам ребер. Структура индекса показана на рисунке 2.
фигура 2
Neo4J также предоставляет такие функции, как получение соседей определенного узла или всех путей кратчайшего расстояния между двумя узлами. Обратите внимание, что для всех этих «обходных» функций Neo4J требует от вас указания типов ребер вдоль путей, что удобно.
Нет необходимости устанавливать Neo4J в качестве программного обеспечения. Мы можем просто импортировать файл JAR для создания встроенной графической базы данных, которая будет сохранена на вашем диске в виде каталога. Документация по Neo4J выглядит полной. Нет ограничений на максимальное количество поддерживаемых узлов в бесплатной версии.
Слабое место:
- Хотя мы можем вручную добавить свойство для узлов с ключом «тип» для аннотирования типа узла, лучше обеспечить встроенную поддержку типов узлов в API, чтобы сделать модель графа более общей. Также проблема возникает, когда узел имеет несколько типов.
- Механизм индексации путем добавления новых ребер вручную пользователем кажется странным и не удобным. Лучше следить за тем, что делает текущая реляционная БД: пользователи говорят: «создать индекс для группы узлов», а затем выполнить.
Вот еще одна статья о том, как начать работу с Neo4J на Java: http://jasperpeilee.wordpress.com/2011/11/22/neo4j-the-first-cup-of-tea/
2. Бесконечный граф (Objectivity Inc.)
InfiniteGraph — это графическая база данных от Objectivity, компании, которая стоит за одноименной базой данных объектов. Бесплатная лицензия может поддерживать только до 1 миллиона узлов и ребер. InfiniteGraph необходимо установить как сервис, который ведет себя как традиционная БД, такая как MySQL. InfiniteGraph заимствует объектно-ориентированные концепции из Objectivity / DB, поэтому каждый узел и ребро в InfiniteGraph являются объектами. Специально,
- Все классы узлов расширят базовый класс BaseVertex;
- Все классы ребер будут расширять базовый класс BaseEdge.
На странице примера, показанной в http://wiki.infinitegraph.com/w/index.php?title=Tutorial:_Hello_Graph! Предположим, что Person — это класс узлов, а Meeting — класс ребер. Это код для добавления ребра между двумя узлами:
Person john = new Person("John", "Hello "); helloGraphDB.addVertex(john); Person dana = new Person("Dana", "Database!"); helloGraphDB.addVertex(dana); Meeting meeting1 = new Meeting("NY", "Graph");
Рисунок 3
InfiniteGraph также предоставляет инструмент визуализации для просмотра данных. Ребро, сгенерированное вышеприведенным кодом, визуализируется на рисунке 3. По сравнению с графической моделью Neo4J на рисунке 1 InfiniteGraph поддерживает узлы с различными типами / классами. Обратите внимание, что пары ключ-значение свойства в Neo4J могут соответствовать переменным-членам в классах InfiniteGraph.
Слабое место:
- Это нормально для установки в качестве службы, но должно сделать настройку простой.
- Поскольку узлы и ребра могут быть объектами, настроенными пользователем, я подозреваю, что производительность будет огромной для огромных графиков, когда мы будем пользоваться гибкостью. Помните, что базы данных NoSQL всегда должны поддерживать высокую производительность, чтобы быть убедительными.
Примечание . Мой опыт работы с InfiniteGraph на 64-битной ОС Win 7 не является гладким. Конфигурация, показанная в http://wiki.infinitegraph.com/w/index.php?title=InfiniteGraph_Installation, кажется, не завершена, что приводит к тому, что Java-программы продолжают выдавать ошибку « … .dll: Не удается найти зависимые библиотеки ». Затем я проверил зависимость этого DLL-файла с помощью Dependency Walker , ошибка «Обнаружены модули с разными типами ЦП» говорит мне, что InfiniteGraph, вероятно, не поддерживает 64-битную ОС. Наконец, я переключаюсь на 64-битную ОС Ubuntu и обнаруживаю, что InfiniteGraph предоставляет только версии для Redhat / SUSE Linux OS.
3. DEX (Sparsity Technologies)
DEX считается высокопроизводительной и масштабируемой графовой базой данных, привлекательной для приложений NoSQL. Персональная ознакомительная версия может поддерживать до 1 миллиона узлов. Текущая версия 4.2 и поддерживает программирование на Java и .NET. Обратите внимание, что старая версия 4.1 поддерживает только Java и не совместима с новой версией. До сегодняшнего дня, 24 ноября 2011 года, документация для новой версии 4.2 еще не завершена, и очень трудно найти стартовый пример для новой версии в Интернете. Файл миграции здесь будет очень полезен для написания программ на основе примеров старых версий.
Рисунок 4
На рисунке 4 показана архитектура DEX, которая объясняет, почему DEX может достичь высокой производительности. Ядро C ++ DEX Core является ключом. На странице событий команда показывает несколько интересных приложений на основе DEX:
- Библиографическое исследование : пример использования DEX для хранения всех данных DBLP ( демо );
- Twitter загружен в DEX : график 4,5 миллиарда;
- Википедия загружена в DEX и Query : явно лучше, чем Neod4J.
DEX также переносим, и вам нужен только JAR-файл для запуска. В отличие от Neo4J, постоянная база данных DEX — это всего лишь один файл. DEX Java API прост в использовании, а Class Graph может обеспечить практически все необходимые операции. Чтобы укрепить DEX, следует устранить следующие слабые места:
- Лучше поднять лимит для персональной версии до 1 миллиарда узлов;
- Более полная документация с прекрасными примерами;
- Пересадите граф алгоритмы на старой версии на новую версию в ближайшее время.
Вот новая запись о том, как развернуть ваш график с DEX.
4. ИнфоГрид (Netmesh Inc.)
InfoGrid называет себя «базой данных веб-графа», поэтому некоторые ее функции ориентированы на веб-приложения. На рисунке 5 показана вся структура InfoGrid, и Graph DB, похоже, не является доминирующим компонентом. InfoGrid имеет несколько приложений в проекте OpenID , который поддерживается той же компанией. Я подозреваю, что InfoGrid используется только во внутреннем Netmesh, из-за следующей слабости:
- Новейший Java API здесь неполный и иногда запутанный;
- Учебник здесь не написан в ясной и формальной форме.
Рисунок 5
Для первого шага примера на http://infogrid.org/wiki/Examples/FirstStep , хотя его нетрудно прочитать в целом, но перечисления, такие как TAGLIBRARY, TAG, TAG_LABEL и TAGLIBRARY_COLLECTS_TAG, приводят меня в замешательство. Эти перечисления, кажется, встроены в модель, и почему это так? Похоже, этот пример используется во внутренних проектах Netmesh для обслуживания некоторых конкретных приложений, но кто знает.
5. HyperGraphDB (Kobrix Inc.)
HyperGraphDB is an open source data storage mechanism with its implementation based on BerkeleyDB database. The graph model of HyperGraphDB is known as direct hypergraphs. In mathematics, a hypergraph allows its edge pointing to more than two nodes. HyperGraphDB extends this further by allowing edges to point to other edges, so HyperGraphDB offers more generality than other graph databases. Figure 6 shows a hypergraph example with four edges, distinguished by different colors.
Figure 6
The tutorial of HyperGraphDB looks complete. Each node in HyperGraphDB is called an atom, and operations like indexing and traversals are supported.
Note: Although the tutorial is written in a nice form, the same error “….dll: Can’t find dependent libraries” occurs on Win 7 OS. After I switch to Ubuntu 64-bit, the sample program throws exception “ELFCLASS32 (possible cause: architecture word width mismatch)”. That’s probably because HyperGraphDB only supports Linux 32-bit.
6. Trinity (Microsoft)
Microsoft joined the competition just recently with the first release V0.1 of Trinity (only allows for intranet access). From the introduction, Trinity is a memory-based graph store with rich database features, including highly concurrent online query processing, ACI transaction support, etc. Trinity only provides C# APIs to the user for graph processing.
Since Trinity package is not open to the outside of Microsoft, we cannot know too much details of it. But at least, the key features of Trinity are listed below:
- Use hypergraph as data model;
- Applicable to be deployed in distributed mode.
The system architecture can be found here. Overall, it is hard to find any distinct advantages currently when we compare Trinity with other open source graph databases. However, since Trinity is still in its prototype stage, it is worth being noticed. In addition, Probase is an ongoing project that looks like an ontology/taxonomy knowledge bases built on top of Trinity. Here links to a nice article about Probase and Trinity.
7. AllegroGraph (Franz Inc.)
AllegroGraph is a persistent graph database that purportedly scales to “billions of RDF triples while maintaining high performance”. Although a RDF triple can be viewed as an edge, AllegroGraph is intended to build RDF-centric semantic web applications and supports SPARQL, RDFS++, and Prolog reasoning from client applications including Java programs. A free version of AllegroGraph RDFStore supports up to 50 million triples.
Figure 7
Figure 7 shows an example of RDF graph. AllegroGraph appends an additional slot called “named graph” for each triple to make them as quads (but still call them triples for convenience). Here are some assertions from Figure 7.
subject predicate object graph robbie petOf jans jans's home page petOf inverseOf hasPet english grammar Dog subClassOf Mammal science
To add a bunch of triples into RDF graph, AllegroGraph has facilities to bulk load from both N-triples and RDF/XML files. Overall, AllegroGraph is ideal for RDF storage, but not for general graphs. The documentation looks great. Find introduction here and for Java API tutorial, the Sesame version here and the Jena version here.
Overall comparison:
The overall comparison is shown in the table below. High-performance and distributed deploy are supposed to be supported by all products. “1M” means the corresponding graph databases can support 1 million nodes for free. RDF graphs can be viewed as a special kind of property graph. Since hypergraph is the most generic form of graphs, a graph database supporting hypergraph should also support property graphs theoretically.
Neo4j |
InfiniteGraph |
DEX |
InfoGrid |
HyperGraphDB |
Trinity |
AllegroGraph |
|
Documentation? |
Good | Good | Fair | Bad | Good | Bad | Good |
Portable? |
Y | N | Y | Y | Y | N | N |
Java? | Y | Y | Y | Y | Y | N | Y |
Free? | Y | < 1M | < 1M | Y | Y | N | < 50 M |
Property Graph? | Y | Y | Y | Y | Y | Y | RDF |
Hypergraph? | N | N | N | N | Y | Y | N |
Tentative Ranking:
Which one is the best? The answer is usually “it depends”. Although it is always controversial to rank products with different characteristics, sometimes we need to make a hard decision. I show the following general rules based on my personal understanding:
- If you need to store RDF triples, go to AllegroGraph;
- For property graph, make Neo4J and DEX the first class citizen;
- For Hypergraph, go to HyperGraphDB.
Source: http://jasperpeilee.wordpress.com/2011/11/25/a-survey-on-graph-databases/