![Page 1: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/1.jpg)
Neo4jГрафовая СУБД
Нелюбин Денис,Тамтэк
![Page 2: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/2.jpg)
Neo4j
http://blog.beany.co.kr/archives/275
![Page 3: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/3.jpg)
Граф
upload.wikimedia.org
![Page 4: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/4.jpg)
Граф
graphviz.org
![Page 5: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/5.jpg)
Граф
G := (V, E)V — это непустое множество вершин, или узлов,E — это множество пар вершин, называемых рёбрами.
![Page 6: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/6.jpg)
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");
![Page 7: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/7.jpg)
Neo4j REST API
POST {}http://localhost:7474/db/data/nodePUT "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/relationshipsPUT "brave Neo4j"http://localhost:7474/db/data/relationship/0/properties/message
![Page 8: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/8.jpg)
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"}
![Page 9: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/9.jpg)
Neo4j Web UI
Свойства узла
![Page 10: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/10.jpg)
Neo4j Web UI
Свойства отношения
![Page 11: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/11.jpg)
Neo4j Web UI
Визуализация
![Page 12: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/12.jpg)
"ORM"
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);
http://code.google.com/p/jo4neo/http://code.google.com/p/ogrm/
![Page 13: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/13.jpg)
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");
![Page 14: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/14.jpg)
Транзакции
Transaction tx = graphDb.beginTx();try { // Mutating operations go here tx.success();} finally { tx.finish();}
![Page 15: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/15.jpg)
Индексация и поиск
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();
![Page 16: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/16.jpg)
Обход графа
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}
![Page 17: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/17.jpg)
Встроенные алгоритмы
• Нахождение путей между вершинами
• Нахождение кратчайших путей между вершинами
• Алгоритм Дейкстры (кратчайшее расстояние между вершинами во взвешенном графе)
![Page 18: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/18.jpg)
Репликация
docs.neo4j.org
![Page 19: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/19.jpg)
Шардинг
![Page 20: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/20.jpg)
Преимущества• Нет схемы• Гибкая и мощная графовая модель данных• Мощные средства обработки графов
Недостатки• Нет схемы• Нет распределенности• Специфичная модель - подходит не для
каждой предметной области
![Page 21: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/21.jpg)
Когда использовать?
Если модель предметной области - множество узлов с разнородными данными и большим количеством разнородных связей между ними.
Иначе: SQL удобнее.
И если все данные умещаются на одной физической машине.
Иначе: другой NoSQL удобнее.
И если вам подойдет лицензия...
![Page 22: CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных](https://reader034.vdocuments.pub/reader034/viewer/2022042602/5587888ed8b42a4c318b4613/html5/thumbnails/22.jpg)
Лицензия
http://neotechnology.com/products/price-list/
• Бесплатно: GPLv3 и AGPL (не LGPL!)• $6000 (или $24000) в год: коммерческая
лицензия
stallman.org