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

Post on 22-Jun-2015

4.470 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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/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

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

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

"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/

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

top related