SlideShare une entreprise Scribd logo
1  sur  23
Neo4j
Графовая СУБД




Нелюбин Денис,
Тамтэк
Neo4j




        http://blog.beany.co.kr/archives/275
Граф




       upload.wikimedia.org
Граф




       graphviz.org
Граф
G := (V, E)
V — это непустое множество вершин, или узлов,
E — это множество пар вершин, называемых
рёбрами.
Neo4j Java API
GraphDatabaseService graphDb =
     new EmbeddedGraphDatabase(DB_PATH);
Node firstNode = graphDb.createNode();
firstNode.setProperty(
    "message", "Hello");

Relationship relationship =
    firstNode.createRelationshipTo(
    secondNode, RelTypes.KNOWS);
relationship.setProperty(
    "message", "brave Neo4j");
Neo4j REST API
POST {}
http://localhost:7474/db/data/node
PUT "Hello"
http://localhost:7474/db/data/node/1/properties/
message

POST {"to": "http://localhost:7474/db/data/node/2",
"type": "knows"}
http://localhost:7474/db/data/node/1/relationships
PUT "brave Neo4j"
http://localhost:7474/db/data/relationship/0/properties/
message
Neo4j REST API
GET http://localhost:7474/db/data/node/1
{
  "outgoing_relationships" : "http://localhost:7474/db/data/
node/1/relationships/out",
  "data" : {
    "message" : "Hello, "
  },
  "property" :
"http://localhost:7474/db/data/node/1/properties/{key}",
  "self" : "http://localhost:7474/db/data/node/1",
 "create_relationship" :
"http://localhost:7474/db/data/node/1/relationships"
}
Neo4j Web UI
Свойства узла
Neo4j Web UI
Свойства отношения
Neo4j Web UI
Визуализация
http://code.google.com/p/jo4neo/
     "ORM"             http://code.google.com/p/ogrm/


public class Message {
    transient Nodeid id;
    @neo(index=true) String message;
    @neo("KNOWS") Message knows;
}
ObjectGraph graph =
    ObjectGraphFactory.instance().
    get(graphDb);
Message hello = new Message();
hello.message = "Hello";
hello.knows = new Message();
graph.persist(hello);
TinkerPop Blueprints
     https://github.com/tinkerpop/blueprints/wiki
     "JDBC" для графовых баз (TinkerGraph, Neo4j,
     Sail(RDF), OrientDB, Dex, InfiniteGraph, Rexter).

Graph graph = new Neo4jGraph(DB_PATH);
Vertex node1 = graph.addVertex(null);
node1.setProperty(
    "message", "Hello");
Edge e = graph.addEdge(
    null, node1, node2, "knows");
e.setProperty(
    "message", "brave Neo4j");
Транзакции

Transaction tx = graphDb.beginTx();
try {
    // Mutating operations go here
    tx.success();
} finally {
    tx.finish();
}
Индексация и поиск

Index<Node> nodeIndex =
    graphDb.index().forNodes(NAME);

Node node = graphDb.createNode();
node.setProperty("message", "Hello");
nodeIndex.add(node, "message", "Hello");


Node foundNode = nodeIndex.get(
    "message", "Hello").getSingle();
Обход графа

Traverser traverser = node.traverse(
        Order.BREADTH_FIRST,
        StopEvaluator.END_OF_GRAPH,
        ReturnableEvaluator.
            ALL_BUT_START_NODE,
        RelTypes.KNOWS,
        Direction.OUTGOING);

for (Node relatedNode : traverser) {
        //TODO
}
Встроенные алгоритмы

• Нахождение путей между вершинами

• Нахождение кратчайших путей между
  вершинами

• Алгоритм Дейкстры (кратчайшее расстояние
  между вершинами во взвешенном графе)
Репликация




             docs.neo4j.org
Шардинг
Преимущества
• Нет схемы
• Гибкая и мощная графовая модель данных
• Мощные средства обработки графов



  Недостатки
• Нет схемы
• Нет распределенности
• Специфичная модель - подходит не для
  каждой предметной области
Когда использовать?
Если модель предметной области - множество
узлов с разнородными данными и большим
количеством разнородных связей между ними.

Иначе: SQL удобнее.


И если все данные умещаются на одной
физической машине.

Иначе: другой NoSQL удобнее.


И если вам подойдет лицензия...
Лицензия
http://neotechnology.com/products/price-list/

• Бесплатно: GPLv3 и AGPL (не LGPL!)
• $6000 (или $24000) в год: коммерческая
  лицензия




                                      stallman.org
Спасибо за внимание



    Нелюбин Денис,
    Тамтэк
    dnelubin@thumbtack.net

Contenu connexe

Tendances

PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данныхОмские ИТ-субботники
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Lenvendo
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksRoman Pavlushko
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
Кратко о MongoDB
Кратко о MongoDBКратко о MongoDB
Кратко о MongoDBGleb Lebedev
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. Yandex
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
20111001 information retrieval raskovalov_lecture2
20111001 information retrieval raskovalov_lecture220111001 information retrieval raskovalov_lecture2
20111001 information retrieval raskovalov_lecture2Computer Science Club
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.mikhaelsmirnov
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
 
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Ontico
 
DBD lection 1. Intro in Database Design. In Russian.
DBD lection 1. Intro in Database Design. In Russian.DBD lection 1. Intro in Database Design. In Russian.
DBD lection 1. Intro in Database Design. In Russian.mikhaelsmirnov
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеVolha Banadyseva
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...Ontico
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache CassandraAlexander Tivelkov
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахAlexander Mezhov
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Thumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetThumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetAlexey Remnev
 

Tendances (20)

PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
2014-01-04 02 Алексей Зиновьев. Выбор NoSQL базы данных
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
Кратко о MongoDB
Кратко о MongoDBКратко о MongoDB
Кратко о MongoDB
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
20111001 information retrieval raskovalov_lecture2
20111001 information retrieval raskovalov_lecture220111001 information retrieval raskovalov_lecture2
20111001 information retrieval raskovalov_lecture2
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3
 
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
 
DBD lection 1. Intro in Database Design. In Russian.
DBD lection 1. Intro in Database Design. In Russian.DBD lection 1. Intro in Database Design. In Russian.
DBD lection 1. Intro in Database Design. In Russian.
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проекте
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache Cassandra
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системах
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Thumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetThumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - Dataset
 

Similaire à CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных

Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)Andrew Panfilov
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentationVlad Orlov
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark JobProvectus
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp
 
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений Mail.ru Group
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Alexey Zinoviev
 
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++corehard_by
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. DatabasesSergey Nemchinsky
 
Serge P Nekoval Grails
Serge P  Nekoval  GrailsSerge P  Nekoval  Grails
Serge P Nekoval Grailsguest092df8
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest
 

Similaire à CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных (20)

Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentation
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Bytecode
BytecodeBytecode
Bytecode
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
 
Dsl for c++
Dsl for c++Dsl for c++
Dsl for c++
 
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Scala for android
Scala for androidScala for android
Scala for android
 
Serge P Nekoval Grails
Serge P  Nekoval  GrailsSerge P  Nekoval  Grails
Serge P Nekoval Grails
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
 

Plus de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 
Алексей Акулович
Алексей АкуловичАлексей Акулович
Алексей АкуловичCodeFest
 

Plus de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 
Алексей Акулович
Алексей АкуловичАлексей Акулович
Алексей Акулович
 

CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных

  • 2. Neo4j http://blog.beany.co.kr/archives/275
  • 3. Граф upload.wikimedia.org
  • 4. Граф graphviz.org
  • 5. Граф G := (V, E) V — это непустое множество вершин, или узлов, E — это множество пар вершин, называемых рёбрами.
  • 6. Neo4j Java API GraphDatabaseService graphDb = new EmbeddedGraphDatabase(DB_PATH); Node firstNode = graphDb.createNode(); firstNode.setProperty( "message", "Hello"); Relationship relationship = firstNode.createRelationshipTo( secondNode, RelTypes.KNOWS); relationship.setProperty( "message", "brave Neo4j");
  • 7. Neo4j REST API POST {} http://localhost:7474/db/data/node PUT "Hello" http://localhost:7474/db/data/node/1/properties/ message POST {"to": "http://localhost:7474/db/data/node/2", "type": "knows"} http://localhost:7474/db/data/node/1/relationships PUT "brave Neo4j" http://localhost:7474/db/data/relationship/0/properties/ message
  • 8. Neo4j REST API GET http://localhost:7474/db/data/node/1 { "outgoing_relationships" : "http://localhost:7474/db/data/ node/1/relationships/out", "data" : { "message" : "Hello, " }, "property" : "http://localhost:7474/db/data/node/1/properties/{key}", "self" : "http://localhost:7474/db/data/node/1", "create_relationship" : "http://localhost:7474/db/data/node/1/relationships" }
  • 10. Neo4j Web UI Свойства отношения
  • 12. http://code.google.com/p/jo4neo/ "ORM" http://code.google.com/p/ogrm/ public class Message { transient Nodeid id; @neo(index=true) String message; @neo("KNOWS") Message knows; } ObjectGraph graph = ObjectGraphFactory.instance(). get(graphDb); Message hello = new Message(); hello.message = "Hello"; hello.knows = new Message(); graph.persist(hello);
  • 13. TinkerPop Blueprints https://github.com/tinkerpop/blueprints/wiki "JDBC" для графовых баз (TinkerGraph, Neo4j, Sail(RDF), OrientDB, Dex, InfiniteGraph, Rexter). Graph graph = new Neo4jGraph(DB_PATH); Vertex node1 = graph.addVertex(null); node1.setProperty( "message", "Hello"); Edge e = graph.addEdge( null, node1, node2, "knows"); e.setProperty( "message", "brave Neo4j");
  • 14. Транзакции Transaction tx = graphDb.beginTx(); try { // Mutating operations go here tx.success(); } finally { tx.finish(); }
  • 15. Индексация и поиск Index<Node> nodeIndex = graphDb.index().forNodes(NAME); Node node = graphDb.createNode(); node.setProperty("message", "Hello"); nodeIndex.add(node, "message", "Hello"); Node foundNode = nodeIndex.get( "message", "Hello").getSingle();
  • 16. Обход графа Traverser traverser = node.traverse( Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, ReturnableEvaluator. ALL_BUT_START_NODE, RelTypes.KNOWS, Direction.OUTGOING); for (Node relatedNode : traverser) { //TODO }
  • 17. Встроенные алгоритмы • Нахождение путей между вершинами • Нахождение кратчайших путей между вершинами • Алгоритм Дейкстры (кратчайшее расстояние между вершинами во взвешенном графе)
  • 18. Репликация docs.neo4j.org
  • 20. Преимущества • Нет схемы • Гибкая и мощная графовая модель данных • Мощные средства обработки графов Недостатки • Нет схемы • Нет распределенности • Специфичная модель - подходит не для каждой предметной области
  • 21. Когда использовать? Если модель предметной области - множество узлов с разнородными данными и большим количеством разнородных связей между ними. Иначе: SQL удобнее. И если все данные умещаются на одной физической машине. Иначе: другой NoSQL удобнее. И если вам подойдет лицензия...
  • 22. Лицензия http://neotechnology.com/products/price-list/ • Бесплатно: GPLv3 и AGPL (не LGPL!) • $6000 (или $24000) в год: коммерческая лицензия stallman.org
  • 23. Спасибо за внимание Нелюбин Денис, Тамтэк dnelubin@thumbtack.net

Notes de l'éditeur

  1. CAP теорема. C - Consistency - целостность данных. A - Availability - доступность данных. P - Partition Tolerance - возможность распределить данные между разными машинами в сети - единственный возможный способ хранить действительно большие объемы данных. Теорема - возможно реализовать лишь две &amp;quot;буквы&amp;quot; из CAP. Neo4j - на грани CA. Целостность достигается за счет полноценных транзакций. Доступность достигается за счет репликации - каждый клиент работает со своей копией данных (embed база).
  2. Это не тот граф :)
  3. Граф выглядит как-то так.
  4. Математический граф - множество вершин и ребер между ними. Узлы и отношения. В Neo4j все отношения имеют явно заданный тип. В Neo4j все узлы и отношения могут иметь свойства - пары ключ-значение.
  5. Обычное Java API. Явно создаются узлы и отношения между ними. Тип отношения - enum. База - embedded. Свойства - ключ-значение. Для отношений явно задается начальный и конечный узлы (подразумевается направленность связей). Буква &amp;quot;J&amp;quot; в названии говорит нам, что СУБД написана на Java.
  6. Весьма продвинутое REST API. Входит в состав дистрибутива БД (на базе HTTP сервера Jetty). POST на /node создает новый узел. PUT на properties/&lt;name&gt; создает/обновляет свойство. POST на /relationships создает отношение. Права доступа никак не ограничены. Нет авторизации и аутентификации. Любой, кто получит доступ к REST может делать что угодно.
  7. Сведения об узле выглядят так (сокращенно). Указаны URL для всех операций.
  8. Красивая веб мордочка. Авторизации и аутентификации тоже нет. Хороший инструмент администратора.
  9. Очень мощные настройки стилей. Можно отображать/расскрашивать узлы по-разному в зависимости от значения их свойств. Есть и плагин к Eclipse.
  10. Существуют аналоги ORM  (скорее OGM - Object Graph Mapping). Класс - узел. Свойство класса - свойство узла. Ссылки на другие объекты - отношения. Nodeid - служебная информация. Недостаток - графовая модель данных искуственно ограничивается. Сложно передать множество связей. Возникают проблемы при рефакторинге, т.к. полные имена классов хранятся в &amp;quot;скрытых&amp;quot; свойствах узлов. Теряется гибкость графовой модели.
  11. &amp;quot;Аналог&amp;quot; JDBC для графовых БД. Графовых БД уже довольно много. Интересен Sail - Storage And Inference Layer для RDF. RDF (Resource Description Framework) - мощнейщий механизм описания данных (метаданных). Триплеты: субъект-предикат-объект. Основа семантического веба 5.0 Зашли в дебри графовых БД... Вернемся обратно к Neo4j.
  12. Транзакции - есть. Выглядят и работают точно так же как в обычных SQL базах.
  13. Индексы - отдельные сущности базы. Создаются явно (однако существует и &amp;quot;автоиндекс&amp;quot;). Индексироваться могут любые свойства узлов (и связей). Возможны полнотекстовые индексы. Результат поиска по индексу - id узлов. Движок - Apache Lucene.
  14. Имеется мощный API для обхода графа. В данном случае: - начиная с данного узла и до конца графа - в ширину (сначала непосредственные потомки, затем &amp;quot;внуки&amp;quot; и т.д.) - включать все узлы, кроме начального - идти по связям типа KNOWS - в направлении ОТ текущего узла Обход графа - &amp;quot;ленивый&amp;quot;. Не строится список узлов, а вычисляется следующий узел в итераторе.
  15. Взвешенный граф - связи между вершинами имеют вес (стоимость). В данном случае вес может определяться любым свойством связи.
  16. Картинка из официальной документации. Классическая репликация. Каждый узел имеет полную копию всех данных. Apache ZooKeeper следит за доступностью серверов и управляет работой Load Balancerа.
  17. Пустой слайд. Нет поддержки шардинга со стороны БД.
  18. Типичное применение: социальные сети и графы &amp;quot;друзей&amp;quot;.
  19. Полнофункциональные версии доступны только под &amp;quot;вирусными&amp;quot; GPL лицензиями. Их можно использовать ТОЛЬКО в GPL коде (Столлман торжествует!). Для проприетарных разработок - коммерческая лицензия.