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

// put data
db.put('marko');
db.put(31);
db.put(true);
// get data
Iterator results = db.get();
Iterator filteredResults = db.get{it.startsWith('ma')};
Хранилище ключей / значений : Для систем хранения на основе ключей / значений структура данных представляет собой упорядоченный 2-кортеж, который содержит ключ и значение. Другие имена для этой структуры данных включают ассоциативный массив, карту или словарь. При взаимодействии с хранилищем ключ / значение пары данных вставляются в базу данных, а значения извлекаются на основе их ключей.
// put data
db.put('name', 'marko');
db.put('age', 31);
// get data
Object value = db.get('name');
Хранилище документов . Следующим уровнем структурной сложности является хранилище документов . Документы представляют собой древовидные / вложенные структуры, такие как предоставляемые XML и JSON . Этот дополнительный уровень сложности обеспечивает большую гибкость моделирования для разработчика. Например, можно смоделировать человека как документ следующим образом:
Document document = {
type : "person",
name : "marko",
age : 31,
skills : {
languages : {
["java", "groovy", "gremlin", "R"]
}
}
}
Чтобы найти специалиста в R , создается «объект запроса». Подобно классическим системам кортежей , объект запроса обеспечивает необходимые привязки. Для всех полей, не указанных, используется подстановочный знак.
// put data
db.put(document);
// get data
Document result = db.findOne({
type : "person",
skills.languages : "R"
});
Наконец, большинство хранилищ ключей / значений и документов поддерживают шаблон MapReduce . С MapReduce каждый документ (или ключ / значение) обрабатывается параллельно, а результат каждого процесса агрегируется и возвращается пользователю. Например, функция map () и redu () может быть написана для определения распределения языков людей в базе данных.

Vertex v = db.putVertex({'name' : 'marko', 'age' : 31});
Vertex u = db.putVertex({'language' : 'gremlin'});
db.putEdge(v, 'hasSkill', u);
Существует два способа получения данных из базы данных графа: сопоставление с образцом и обход . Запрос на сопоставление с шаблоном во многом похож на запрос документов в хранилище документов. Шаблон графа определяется, когда конкретные компоненты являются переменными (то есть подстановочными знаками). Классическим языком для сопоставления с образцом на основе графа является SPARQL .
SELECT ?x ?y WHERE {
?x knows marko .
marko hasSkill ?y .
?x hasSkill ?y
}
В приведенном выше запросе переменные ? X и ? Y связывают людей и навыки соответственно. Тем не менее, правило графического шаблона говорит, что привязка происходит только для тех людей, которые знают Марко и делятся с ним навыком.
Вторая модель запроса — это обход графика. При обходе графа можно коснуться (и зациклить) произвольного числа вершин / ребер, чтобы получить конечные точки (места обхода), пути (история обхода) или результирующие вычисления (побочный эффект обхода). На языке обхода графа Gremlin , возраст людей, которые делятся навыками с Марко, можно определить с помощью следующего запроса ( назначение обхода ):
marko.out('hasSkill').in('hasSkill').except([marko]).age
Чтобы определить все нецикличные пути дружбы между Марко и Джошем, можно оценить следующее ( история обхода ):
marko.out('friend').uniquePath.loop(2){it.object != josh}.paths
Наконец, чтобы определить центральность каждой вершины в графе, можно использовать обход следующей формы, где m — карта, в которой хранится итоговая оценка центральности для каждой вершины ( побочный эффект обхода ).
m = [:]
g.V.out.groupCount(m).loop(2){it.loops < 100}
Существует множество типов баз данных. Каждый предоставляет средства для хранения и извлечения структурированных данных. В зависимости от сложности моделируемого домена и требуемых типов вычислений существует база данных для удовлетворения потребностей каждого проекта.
Рекомендации
Родригес, М. А., « Обзор парадигм управления данными: реляционные, документы и графики », семинар по управлению данными, Университет Нью-Мексико, февраль 2010 г.
Уэббер Дж. « Квадратные колышки и круглые отверстия в мире NOSQL », World Wide Webber, апрель 2011 г.
Родригес М.А., Нойбауэр П. « Конструкции из точек и линий », Бюллетень Американского общества информатики и техники, 36 (6), с. 35–41, doi: 10.1002 / bult.2010.1720360610, август 2010 г.
Rahien, A. « Что не так, SQL — хранилище ключей / значений» , «Неестественные законы в отношении исходного кода», март 2010 г.
