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

23
Neo4j Графовая СУБД Нелюбин Денис, Тамтэк

Upload: codefest

Post on 22-Jun-2015

4.469 views

Category:

Documents


1 download

TRANSCRIPT

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

Neo4jГрафовая СУБД

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

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

Neo4j

http://blog.beany.co.kr/archives/275

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

Граф

upload.wikimedia.org

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

Граф

graphviz.org

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

Граф

G := (V, E)V — это непустое множество вершин, или узлов,E — это множество пар вершин, называемых рёбрами.

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

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 — графовая база данных

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 — графовая база данных

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 — графовая база данных

Neo4j Web UI

Свойства узла

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

Neo4j Web UI

Свойства отношения

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

Neo4j Web UI

Визуализация

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

"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 — графовая база данных

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 — графовая база данных

Транзакции

Transaction tx = graphDb.beginTx();try {    // Mutating operations go here    tx.success();} finally {    tx.finish();}

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

Индексация и поиск

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 — графовая база данных

Обход графа

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 — графовая база данных

Встроенные алгоритмы

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

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

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

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

Репликация

docs.neo4j.org

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

Шардинг

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

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

Недостатки• Нет схемы• Нет распределенности• Специфичная модель - подходит не для

каждой предметной области

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

Когда использовать?

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

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

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

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

И если вам подойдет лицензия...

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

Лицензия

http://neotechnology.com/products/price-list/

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

лицензия

stallman.org

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

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

Нелюбин Денис,Тамтэк[email protected]