Upload
codefest
View
4.470
Download
1
Embed Size (px)
Citation preview
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
Спасибо за внимание
Нелюбин Денис,Тамтэк[email protected]