Neo4j
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
- http://docs.neo4j.org
 - http://neo4j.com/docs/
 - http://neo4j.com/docs/stable/
 - http://neo4j.com/docs/stable/cypher-refcard/
 - http://neo4j.com/developer/
 
Interfaces:
Performance Tuning:
Videos:
- Webinars: http://watch.neo4j.org
 - YouTube Channel: http://www.youtube.com/neo4j
 - Tips and Tricks for Graph Data Modeling
 - Relational to Graph Data Modeling - Tipps zum Überführen eines SQL- in ein Neo4j-Modell
 
Entwicklung
Einbettung mittels PHP:
- Neo4jPHP ist ein PHP-Framework, um REST-API anzusprechen. Alle wichtigen Operationen enthalten.
 - https://github.com/endyjasmi/cypher
 - https://github.com/jakewins/Neo4j.php
 
Visualisierung:
- http://www.neo4j.org/develop/visualize
 - http://neo4j.com/blog/graph-this-rendering-your-graph-with-graphviz/
 - https://www.tomsawyer.com/products/perspectives/
 - JavaScript Bibliotheken
- Daten für Suche aufbereiten: VisualSearch.js (siehe iX Big Data S.76)
 - Graph query builder: popoto.js (siehe iX Big Data S.76)
 
 
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
- http://neo4j.com/developer/guide-importing-data-and-etl/
 - https://github.com/jexp/neo4j-shell-tools
 - http://stackoverflow.com/questions/20831287/neo4j-output-format
 - http://stackoverflow.com/questions/18830686/export-whole-database-in-cypher-format-ascii-text
 
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
- http://www.hacksparrow.com/neo4j-tutorial-rest-api.html
 - http://neo4j.com/blog/the-neo4j-rest-server-part1-get-it-going/
 
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.