Статьи

Новые чертежи Tinkerpop для MongoDB и Datomic: графики, графики, графики

Недавно Datablend открыл две новые реализации Tinkerpop Blueprints : blueprints-mongodb-graph и blueprints-datomic-graph . Tinkerpop — это проект с открытым исходным кодом, который предоставляет весь стек технологий в пространстве базы данных графов. В основе этого стека лежит платформа Blueprints. Чертежи могут рассматриваться как JDBC графовых баз данных. Предоставляя набор универсальных интерфейсов, он позволяет разрабатывать приложения на основе графов без явных зависимостей от конкретных реализаций базы данных графов. Кроме того, Blueprints предоставляет конкретные привязки для Neo4J , OrientDB и DexГраф Базы данных. Помимо Blueprints, команда Tinkerpop разработала целый ряд графических технологий, включая Gremlin , мощный, специфичный для предметной области язык, предназначенный для обхода графов. Следовательно, как только привязка Blueprints станет доступной для конкретной базы данных графов, можно будет использовать весь спектр технологий.

1. MongoDB Graph

Реализация mongoDB Blueprints предоставляет пользователям масштабируемую , распределенную реализацию базы данных Graph. MongoDB граф не требует какой — либо информации о базовой физической установки MongoDB, поэтому чтение / запись масштабируемость может быть легко достигнуто за счет изначально поддерживаемых MongoDB в репликации и сегментирование функциональных возможностей . Некоторые начальные тесты (запись / чтение 100 000 вершин, где каждые 2 вершины соединены через ребро) на одном узле mongoDB показывают следующую производительность:

Writing 100.000 vertices and 50.000 edges ... 
Writing took: 2760 ms

Reading 100.000 vertices and 50.000 edges ... 
Reading took: 646 ms

Не слишком потрепанный для запуска его на одном экземпляре mongoDB. В настоящее время каждая запись выполняется как отдельная фиксация в хранилище mongoDB. Хотя этот процесс можно улучшить, выполняя запись с помощью оптимизированных пакетов , мы должны убедиться, что транзакционная семантика стека Blueprints все еще соблюдается. Дальнейшая оптимизация производительности будет выпущена в ближайшее время, так что следите за проектом github blueprints-mongodb-graph .

2. Datomic Graph

Datomic — это новая система распределенных баз данных, разработанная для обеспечения масштабируемых, гибких и интеллектуальных приложений, работающих на облачных архитектурах следующего поколения. Datomic использует мощную модель данных (основанную на концепции Datoms ) и язык выразительных запросов (основанный на концепции Datalog . Кроме того, он вводит явное понятие времени , которое позволяет выполнять запросы как к предыдущему, так и к будущему состояния базы данных RDF и SPARQL чувствуют модель данных Datomic и подход запроса, что делает его идеальной целью для реализации графа свойств. Следовательно, реализация Blueprints-datomic-graph Blueprints.

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

// Create the datomic-based graph
DatomicGraph graph = new DatomicGraph("datomic:mem://tinkerpop");

// Create the vertex for Davy
Vertex davy = graph.addVertex(null);
davy.setProperty("name","Davy");

// Create the vertex for Marko
Vertex marko = graph.addVertex(null);
marko.setProperty("name","Marko");

// Add the knows-relationship between Davy and Marko
Edge davy_marko = graph.addEdge(null, davy, marko, "knows");

Thread.sleep(1000);
Date checkpoint = Calendar.getInstance().getTime();
Thread.sleep(1000);

// Reset the name of Davy
davy.setProperty("name","DavyUpdated");

// Create the vertex for Peter
Vertex peter = graph.addVertex(null);
peter.setProperty("name","Peter");

// Add the knows-relationship between Marko and Peter
Edge marko_peter = graph.addEdge(null, marko, peter, "knows");

// Retrieve all "knows" relationships that are "currently" in the database
System.out.println("Current relationships:");
Iterator<Edge> edgesit = graph.getEdges().iterator();
while (edgesit.hasNext()) {
    Edge edge = edgesit.next();
    System.out.println(edge.getVertex(Direction.OUT).getProperty("name") + " -> " + edge.getLabel() + " -> " +
                       edge.getVertex(Direction.IN).getProperty("name"));
}

// Set the checkpoint in the past
graph.setCheckPoint(checkpoint);

// Retrieve all "knows" relationships that were in the database at the specified checkpoint
System.out.println("Relationships at checkpoint " + checkpoint + ":");
edgesit = graph.getEdges().iterator();
while (edgesit.hasNext()) {
    Edge edge = edgesit.next();
    System.out.println(edge.getVertex(Direction.OUT).getProperty("name") + " -> " + edge.getLabel() + " -> " +
                       edge.getVertex(Direction.IN).getProperty("name"));
}

Как и следовало ожидать, это выводит следующую информацию:

Current relationships:
DavyUpdated -> knows -> Marko
Marko -> knows -> Peter

Relationships at checkpoint Tue Jul 23 20:21:17 CEST 2012:
Davy -> knows -> Marko

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