Статьи

Создание драйвера JDBC для Neo4j

Когда дело доходит до баз данных NOSQL, одним из ключевых преимуществ является то, что они позволяют структурировать ваши данные таким образом, чтобы он лучше походил на ваш домен, а также позволяют использовать языки запросов, где вы можете выражать вещи, которые являются либо действительно неуклюжими, либо медленными. с SQL. Однако одним из преимуществ реляционных баз данных является то, что к ним можно получить доступ из множества инструментов, использующих JDBC в качестве стандартного API. Так что же произойдет, если база данных NOSQL, такая как Neo4j , также будет иметь драйвер JDBC? Я решил выяснить!

Neo4j имеет REST API, который обеспечивает распределенный доступ, и язык запросов, называемый Cypher, который можно использовать для специальных запросов. Поскольку результатом таких запросов являются итерируемые карты с ключами-значениями, их можно довольно легко преобразовать в концепцию JDBC ResultSet. Поэтому я создал тонкую реализацию API JDBC, используя фреймворк Restlet, который делегирует этот REST API и отправляет строки запросов в конечную точку Cypher. Запросы и ответы JSON обрабатывались с использованием библиотеки JSON Джексона.

Следующий вопрос: если клиент попытался перечислить таблицы и их столбцы, что должно быть возвращено? Подход, который я сейчас выбрал, состоит в том, чтобы ввести «узлы типа», то есть узлы, которые не являются экземплярами в модели предметной области, а вместо этого представляют метаинформацию о модели. Для моделирования таблиц я представил сам узел типа, а также узлы свойств, которые содержат имя свойства и его тип. Экземпляры этих типов будут тогда связаны с их типом узла с отношением IS_A. Смотрите рисунок ниже для примера:

Драйвер JDBC теперь может запрашивать список таблиц со следующим запросом Cypher, выраженным с использованием DSL, описанного в предыдущем посте:

start(node("n", 0)).
match(path().from("n").out("TYPE").to("type")).
returns(properties("type.type"));

Это в основном означает: «На начальном узле следуйте соотношению TYPE, чтобы найти все узлы типов, а затем верните их имена». Для отображения свойств узла определенного типа можно использовать параметризованный запрос. Это делается для вызова API JDBC DatabaseMetaData.getColumns, например:

public ExecuteWithParameters getColumns(String typeName)
{
return start(node("n", 0)).
       match(path().from("n").out("TYPE").to("type").
       link().out("HAS_PROPERTY").to("property")).
       where(prop("type.type").eq(param("typename"))).
       returns(properties("type.type", "property.name", "property.type")).
          parameter("typename", typeName);
}

 

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

Причудливый режим

Хотя драйвер JDBC можно использовать как есть для выполнения специальных запросов Cypher, для его использования из обычных инструментов, поддерживающих SQL, требуется немного больше работы. В частности, большинство этих инструментов будут отправлять стандартизированные запросы SQL для получения данных, такие как «SELECT * FROM Person», которые не будут работать с этим драйвером JDBC, так как поддержка SQL отсутствует.

Что я сделал здесь, так это создал «режим причуд», который распознает эти вызовы и преобразует их в эквиваленты Cypher. Сделав это, я смог заставить работать инструменты, описанные ниже. Это означает, что если вы хотите попробовать инструмент, явно не указанный ниже, часть обнаружения инструмента, вероятно, не будет работать должным образом, тогда как отправка строк запроса и просмотр результатов должны работать. Пожалуйста, пришлите мне записку, если у вас есть инструмент, который вы хотели бы поддержать!

DbVisualizer

Теперь я мог получить доступ к своей базе данных Neo4j, используя различные инструменты JDBC. Вот скриншот из DbVisualizer , который был первым инструментом, с которым я пытался использовать его:

А вот еще один скриншот, показывающий, как отправлять специальные запросы Cypher:

LibreOffice

Когда дело доходит до использования базы данных в качестве инструмента отчетности, одна из самых простых вещей, которую вы можете сделать, — это использовать один из пакетов Office, подключиться к базе данных и использовать данные для диаграмм и электронных таблиц. Так как LibreOffice имеет довольно хорошее соединение с JDBC, я попробовал это, и вот результат:

ODBC в Windows

Хотя наличие драйвера JDBC прекрасно, не все инструменты, работающие с базами данных, используют JDBC. Некоторые используют вместо этого ODBC, и поскольку есть доступ к шлюзу ODBC-JDBC, доступному от Easysoft, я хотел попробовать это. После установки этого программного обеспечения было очень легко установить соединение, а затем подключиться к нему с помощью стандартного инструмента ODBC. Вот скриншот того, как это выглядит:

IntelliJ

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

JDBC как апплет

Как насчет использования JavaScript? Хотя вы можете получить доступ к Neo4j напрямую из JavaScript, используя вызовы REST, все же есть некоторые преимущества использования драйвера JDBC в веб-браузере, поскольку API JDBC абстрагирует такие вещи, как типы и другие метаданные. Из-за этого я сделал упаковку драйвера как Java-апплет, чтобы он мог быть включен в HTML-страницы и вызываться через Javascript. Вы можете увидеть пример этого здесь .

Будущие идеи

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

Если / когда Neo4j получит протокол двоичного соединения, будет интересно попробовать и поддержать его вместо REST API. Это должно обеспечить более высокую производительность, как из-за эффективности сериализации, так и управления соединениями.

Вывод

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

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

 

Источник: http://rickardoberg.wordpress.com/2011/12/19/creating-a-jdbc-driver-for-neo4j/