Neo4j

Rodzaje baz danych

  • Relacyjne
  • Kolumnowe
  • Obiektowe
  • Dokumentowe
  • Klucz-wartość
  • Grafowe
  • Od groma innych

Relacyjne bazy danych

Kolumnowe bazy danych

Relacyjna vs kolumnowa

1, Jan, Uciński, 6544, 2, Monika, Karolak, 3456, 3, Karol, Witka, 2345, 4, Kasia, Nowak, 7542

1, 2, 3, 4, Jan, Monika, Karol, Kasia, Uciński, Karolak, Witka, Nowak, 6544, 3456, 2345, 7542

Obiektowa baza

ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded
    .newConfiguration(), DB4OFILENAME);
try {
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    db.store(pilot1);
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    db.store(pilot2);
} finally {
    db.close();
}
ObjectSet result = db
    .queryByExample(new Pilot("Michael Schumacher"));
Pilot found = (Pilot) result.next();
found.addPoints(11);
db.store(found);
ObjectSet result = db
    .queryByExample(new Pilot("Michael Schumacher"));
Pilot found = (Pilot) result.next();
db.delete(found);

Dokumentowe

import pymongo
from pymongo import MongoClient
import datetime

client = MongoClient('localhost', 27017)
db = client.test_database

new_posts = [{"author": "Mike",
               "text": "Another post!",
               "tags": ["bulk", "insert"],
               "date": datetime.datetime(2009, 11, 12, 11, 14)},
              {"author": "Eliot",
               "title": "MongoDB is fun",
               "text": "and pretty easy too!",
               "date": datetime.datetime(2009, 11, 10, 10, 45)}]

db.posts.insert(new_posts)

print "Ilość Majków: " + db.posts.find({"author": "Mike"}).count()

Klucz-wartość

  • REST
  • Niezawodność
  • Map reduce
  • Operacje na dokumentach
  • ...
curl -v -X PUT http://localhost:8091/riak/strona/index \
-H "Content-Type: text/html" \
-d "<html><body><h1>Jakaś durna strona</h1></body></html>"


curl -i -X POST http://localhost:8091/riak/people \
-H "Content-Type: application/json" \
-d '{"firstname" : "Jan", "lastname" : "Nowak"}'

curl http://localhost:8091/riak/people/6VZc2o7zKxq2B34kJrm1S0ma3PO

curl -i -X DELETE http://localhost:8091/riak/people/6VZc2o7zKxq2B34kJrm1S0ma3PO

... i wiele, wiele innych ...

Grafowa baza danych

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://www.example.org/terms/">
    <rdf:Description rdf:about="http://www.example.org/ginger">
        <name>Ginger Rogers</name>
        <occupation>dancer</occupation>
        <partner rdf:resource="http://www.example.org/fred"/>
    </rdf:Description>
    <rdf:Description rdf:about="http://www.example.org/fred">
        <name>Fred Astaire</name>
        <occupation>dancer</occupation>
        <likes rdf:resource="http://www.example.org/ice-cream"/>
    </rdf:Description>
</rdf:RDF>

Property graph

Węzły

Relacje

 

Właściwości

Odpalamy Neo4j!

neo4j/bin/neo4j start

http://localhost:7474

http://localhost:7474/webadmin/

Operacje na Neo4j

  • Cypher
  • RESTful Web Services
  • neo4j-shell
  • Gremlin

neo4j-shell

// Tworzy nowy node i przechodzi do niego
mknode --cd

// Przechodzi do węzła o podanym numerze
cd 1

// Wraca w poprzednie miejsce
cd ..

// Tworzy relację od aktualnego węzła do jakiegoś nowego (-c)
mkrel -t KNOWS -c -v

// Tworzy relację od aktualnego węzła do węzła 123
mkrel -t KNOWS 123

// Ustawia się na relacji o podanym identyfikatorze
cd -r 2

// Ustawia jakąś właściwość na aktualnym węźle lub relacji
set someProperty "Some value"

// Wypisuje wszystkie relacje
ls -rv

// Wypisuje wszystkie informacje o node/relacji
ls -v

Gremlin

Neo4j API

enum RelationshipTypes implements RelationshipType { ACTS_IN };

GraphDatabaseService gds = new EmbeddedGraphDatabase("/path/to/store");

Node forrest=gds.createNode();
forrest.setProperty("title","Forrest Gump");
forrest.setProperty("year",1994);

gds.index().forNodes("movies").add(forrest,"id",1);

Node tom=gds.createNode();
tom.setProperty("name","Tom Hanks");

Relationship role=tom.createRelationshipTo(forrest,ACTS_IN);
role.setProperty("role","Forrest");

Node movie=gds.index().forNodes("movies").get("id",1).getSingle();
assertEquals("Forrest Gump", movie.getProperty("title"));

for (Relationship role : movie.getRelationships(ACTS_IN,INCOMING)) {
	Node actor=role.getOtherNode(movie);
	assertEquals("Tom Hanks", actor.getProperty("name"));
	assertEquals("Forrest", role.getProperty("role"));
}

Neo4j i Spring Data

Neo4j

By Artur Owczarek

Neo4j

  • 638