Neo4j

aus www.kruedewagen.de, Homepage von Ralf und Judith Krüdewagen (Kruedewagen)
Zur Navigation springen Zur Suche springen
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

Auf dieser Seite befasse ich mich mit der Graph-Datenbank Neo4j. Ich habe angefangen, mich darin einzuarbeiten.

Allgemein

  • Neo4j Homepage
  • High-performance NoSQL graph database
  • Knoten (Nodes) und Kanten (Relationships)
  • Knoten und Kanten werden ergänzt um "Properties" als Schlüssel/Werte-Paare (Key/Value), auch als Array möglich -> Property-Graph-Modell

Grundlagen

Neo4j kennt vier Grundelemente eines Graphen:

  • Nodes
  • Relationships
  • Properties
  • Labels

Artikel

  • siehe iX 02/11 S.130
  • siehe PHP Magazin 04/13 S.26
  • Neo4j mit Perl (mit Neo4j Grundlagen): siehe LM 06/14 S.102

Dokumentation

Interfaces:

Performance Tuning:

Videos:

Entwicklung

Einbettung mittels PHP:

Visualisierung:

Installation

Authentifizierung

Standard:

neo4j/neo4j

mit curl:

curl ... -u neo4j:pw ...

Password in

/data/dbms/auth

Authentifizierung ein/ausstellen:

conf/neo4j-server.properties

Tipps und Tricks

Cypher

Create nodes and relations

Mensch ist Label. m1 und m2 sind "Variablen", die später im Cypher-Script genutzt werden können.

Nodes:

create (m1:Mensch {name:'Adam', type:'Mann', location:'Paradies'})
create (m2:Mensch {name:'Eva', type:'Frau', location:'Paradies'})
create (t1:Haustier {name:'Snakie', type:'Schlange', location:'Paradies'})
create (t2:Haustier {name:'Doggie', type:'Hund', location:'Paradies'})

Relations:

create (t1)-[:IS_PET_OF]->(m2)
create (t2)-[:IS_PET_OF]->(m1)
create (m1)-[:IS_PARTNER_OF {type:'married'}]->(m2)

Abfragen

Nodes:

MATCH (n) RETURN n LIMIT 100

Nur die Ids der Nodes:

match (n) return id(n) as ID

Nodes und Relationships:

START n=node(*) MATCH (n)-[r]->(m) RETURN n,r,m;
MATCH (n)-[r]->(m) RETURN n AS FROM , r AS `->`, m AS to;

Mit Index:

start n=node:node_audo_index("term:*") return n;

oder

http://localhost:7474/db/data/index/auto/node/?query=term:*

Siehe Plugins für Abfragen:

http://neo4j.com/docs/stable/server-plugins.html

Delete

Delete a node:

MATCH (n { name: 'Adam' }) DELETE n

Delete a node with relationships

MATCH (n { name: 'Adam' })-[r]-() DELETE n, r

Delete ALL nodes with relationships

MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r

import-cypher

  • Variablen nicht mit '' umschließen (auch nicht bei Strings mit Leerzeichen), weil sonst {Name} als Wert abgespeichert wird.
Falsch
import-cypher -d , -i in.csv -o out.txt create (n:#{Label} {name: '{Name}'}) return *
Richtig
import-cypher -d , -i in.csv -o out.txt create (n:#{Label} {name: {Name}}) return *
  • Datentyp kann im Import-File angegeben werden. Default ist "string". Integer dürfen nicht leer sein - wenn leer sein soll, dann Property weglassen. Es gibt kein NULL.
  • neue Features in 2.2: mehrere Input-Dateien, die man miteinander verbinden kann über Referenzen

Browser

Getting started

:play welcome

Diverses

:history
:style
:config
:schema (prüft u.a. ob Index verfügbar)
:clear
:help keys
:help commands

Query Templates

  • für "create" und "find"

Planner

Query Plan erstellen als Dry-Run für Queries - keine Execution:

explain <query>

Planner:

  • PLANNER RULE
  • PLANNER COST - neu in 2.2 in der Regel schneller

Profile, prüft ob Query Plan verfügbar:

profile <query>

Import und Export von Daten

Kompletter Dump:

neo4j-sh -c dump > export.cypher

Direktes Importieren eines Dumps in eine andere DB:

db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-shell -path db2/data/graph.db/

REST API

curl -v http://localhost:7474/db/data/
curl -v http://localhost:7474/db/data/node/84

Namen

Nicht verifiziert (besonders die Aussagen zu Leerzeichen):

  • Node Labels mit camelCase, dürfen keine Leerzeichen enthalten, erster Buchstabe groß, z.B. "CarOwner".
  • Property Namen mit camelCase (ohne Leerzeichen), erster Buchstabe klein, z.B. "isMale".
  • Property Values mit '' oder "" umschließen, wenn als String.
  • http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml
  • Leerzeichen mit `` umschließen.

Datentypen

  • Zahlen werden zu Integers oder Floats, wenn nicht mit '' oder "" umschlossen.

Beispiele

Switches und Ports

Anwendungen