1. NEO4J ET SON ECOSYSTÈME
Sylvain ROUSSY
Ingénieur conseil – HINNOYA
sroussy@hinnoya.fr
@SylvainRoussy
JUG Lyon : – Neo4j et son ecosystème 15 Janvier 2013 –
sroussy@hinnoya.fr
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
2. Plan
Qu’est-ce que NEO4j ?
Qu’est qu’une BDD orientée « Graphe » ?
Pourquoi utiliser une BDD orientée « Graphe » ?
A propos de NEO4j…
NEO4j avec Java
NEO4j sans Java
Interroger NEO4j
Intégrer NEO4j
S’abstraire de NEO4j
Outillage
Conclusions
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
3. QU’EST-CE QUE NEO4J ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
4. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
5. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 5
6. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 6
7. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 7
8. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 8
9. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 9
10. Qu’est-ce que NEO4j ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 10
11. QU’EST-CE QU’UNE BASE DE
DONNÉES ORIENTÉE « GRAPHE »?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
12. Base de données orientée « Graphe »
* Une base dont la structure est représentée sous forme de
« graphe » (théorie des graphes)
Ce graphe est basé sur des Nœuds et des Arcs
NEO4j : Node – Relationships
Blueprints : Vertex – Edges
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
13. Base de données orientée « Graphe »
* Dans cette structure de données, nous considérons
que la relation est aussi importante que l’entité
La relation est identifiée par un nom (sémantique)
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
14. Quelques bases de données orientées « Graphe »
NEO4j (Java)
Neo Technology
OrientDB (Java)
Nuvela Base
DEX (C++)
Sparsity Technologies
TinkerGraph (Java)
TinkerPop
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
15. POURQUOI UTILISER UNE BASE DE
DONNÉES ORIENTÉE « GRAPHE »?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
19. Reconnaître des structures
Quels sont, dans mon cercle d’amis, les victimes et les
revendeurs de mes livres ?
Sylvain -> « PRETE » -> Ami
Ami -> « VENDS » -> Ami2
Ami2 -> « OFFRE » -> Sylvain
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
20. Cas d’utilisations
Où la relation est importante !
Réseaux sociaux (Viadeo, LinkedIn, etc.)
Où la reconnaissance de structure est importante !
Fraudes, Excellences
Mes amis qui n’en sont pas…
Où le chemin est important ! (Shortest Path, …)
Généalogie (Héritage)
Système d’information géographique
Séquence (Groupware, etc.)
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
21. A PROPOS DE NEO4J
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
22. A propos de NEO4j
Editeur : Neo Technology (créée en 2000 – Suède/USA)
Version stable à ce jour : 1.8.1 (14/12/2012)
Version en cours de stabilisation : 1.9 M03
30 Milliards de nœuds
30 Milliards de relations
64 Milliards de propriétés
www.neo4j.org
« HEROKU »
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
23. A propos de NEO4j
Deux types d’utilisation :
Embedded
GraphDatabaseService graph =
new EmbeddedGraphDatabase("/var/mydb");
Server (JETTY)
REST API
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
24. NEO4J AVEC JAVA
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
25. Créer des nœuds…
// Création d’un premier nœud
Node node1 = graph.createNode();
node1.setProperty("name", "Base de données");
// Création d’un second nœud
Node node2 = graph.createNode();
node1.setProperty("name", « NEO4j");
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
26. … et créer des relations
// Création d'une relation "EST" du second noeud vers le premier
Relationship rel =
node2.createRelationshipTo(node1,
DynamicRelationshipType.withName("EST")) ;
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
27. Indexer des propriétés (Lucène)
Basé sur triplette : propriété, valeur, objet
Implicitement par configuration
node_auto_indexing=true
node_keys_indexable=name,age
relationship_auto_indexing=true
relationship_keys_indexable=name,age
Explicitement
Par le code (IndexManager)
Manuellement (Shell)
REST
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
28. Utiliser les transactions (ACID)
// Ouverture et Commit d’une transaction
Transaction tx = graph.beginTx ();
[…]
tx.success ();
// RollBack
tx.failure ();
Fermeture de la transaction (relâchement des
verrous)
tx.finish ();
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
29. NEO4J SANS JAVA
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
30. Créer des nœuds…
// Création d’un premier noeud
POST http://localhost:7474/db/data/node
Accept: application/json
Content-Type: application/json
{
"name" : "base de données"
}
// Création d’un second noeud
POST http://localhost:7474/db/data/node
Accept: application/json
Content-Type: application/json
{
"name" : « NEO4j"
}
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
31. … et créer des relations
// Création d’un premier noeud
POST http://localhost:7474/db/data/node/1/relationships
Accept: application/json
Content-Type: application/json
{
"to" : "http://localhost:7474/db/data/node/0",
"type" : « EST"
}
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
32. Batch
Transaction atomique
POST http://localhost:7474/db/data/batch
Accept: application/json
Content-Type: application/json
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
34. CYPHER : Langage d’interrogation
Langage d’interrogation propriétaire à NEO4j
Proche de SQL
Permet l’interrogation et la modification des
données
Basé sur quatre éléments clés :
START : nœud(s) ou relation(s) de départ
MATCH : motif relationnel
WHERE : restriction
RETURN : éléments à retourner
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
35. CYPHER : Langage d’interrogation
Quels sont, dans mon cercle d’amis, les victimes et
les revendeurs de mes livres ?
START sylvain=node(0)
MATCH sylvain-[:PRETE]->ami-[:VENDS]->ami2-[:OFFRE]->sylvain
RETURN ami.Nom AS REVENDEUR, ami2.Nom AS VICTIME
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
36. CYPHER : Langage d’interrogation
CYPHER s’utilise depuis :
Le code JAVA
L’API REST
La console d’administration Web
Le Shell
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
37. Code Java : Utiliser un « traversier » (Traversal)
TraversalDescription description =
Traversal.description()
.breadthFirst()
.relationships (PRETE, Direction.OUTGOING )
.relationships(VENDS, Direction.OUTGOING )
.relationships(OFFRE, Direction.OUTGOING )
.evaluator( Evaluators.toDepth( 5 ) )
.uniqueness (Uniqueness.RELATIONSHIP_PATH);
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
38. Code Java : Utiliser un traversier (Traversal)
Node sylvain = graph.getNodeById(0);
for (Path position : description.traverse( sylvain ) )
{
System.out.println ("Path :"+position.toString());
}
Path :(0)
Path :(0)--[PRETE,1]-->(2)
Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3)
Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3)--[OFFRE,3]-->(0)
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
39. GREMLIN : Langage d’interrogation (Tinkerpop)
GREMLIN est Groovy
NEO4J, Tinkergraph, DEX, OrientDB, etc.
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
41. En pure Java
public class Person
{
static final String NAME = "name";
private final Node underlyingNode;
Person( Node personNode ) {
this.underlyingNode = personNode;
}
protected Node getUnderlyingNode() {
return underlyingNode;
}
public String getName() {
return (String)underlyingNode.getProperty( NAME );
} […]
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
42. Avec Spring DATA
@NodeEntity
public class Movie
{
@GraphId
Long id;
@Indexed(type = FULLTEXT, indexName = "search")
String title;
Person director;
@RelatedTo(type="ACTS_IN", direction = INCOMING)
Set<Person> actors;
@RelatedToVia(type = "RATED")
Iterable<Rating> ratings;
@Query("start movie=node({self}) match movie-->genre<--similar return
similar")
Iterable<Movie> similarMovies;
}
http://www.springsource.org/spring-data/neo4j
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
44. Tinkerpop
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
45. Tinkerpop : Blueprints
Graph blueGraph = new Neo4jGraph("/var/mydb");
Vertex v1 = blueGraph.addVertex(1);
v1.setProperty("name", "Base de données");
Vertex v2 = blueGraph.addVertex(2);
v2.setProperty("name", "NEO4j");
Edge rel = blueGraph.addEdge(3, v1, v2, "EST");
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
46. Tinkerpop : Frames
public interface FramesPerson extends VertexFrame
{
@Property ("lastname")
public String getLastname ();
@Property ("lastname")
public void setLastName (String lastname);
@Adjacency (label = "KNOWS")
public Iterable<FramePerson> getFriends ();
@Adjacency (label = "KNOWS")
public void addFriend (FramesPerson friend);
}
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
47. OUTILLAGE
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
48. Shell
Permet la consultation d’une base en cours
d’utilisation !
$> Neo4jShell -path /var/mydb -readonly
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
49. Console Web - Dashboard
http://monserveur_db:7474
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
50. Console Web – Data browser
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
51. Console Web – Console
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
52. Neoclipse
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
53. POURQUOI NEO4J ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
54. Pourquoi NEO4j ?
Support d’un éditeur : Neo Technology
• Version communautaire (GPL)
• Version Advanced (AGPL)
• Advanced monitoring
• Version Enterprise (AGPL)
• Sauvegarde à chaud
• HA
Documentation dense (+500 pages pour le manuel)
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
55. CONCLUSION
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
56. Conclusion
Représentation naturelle des relations
« Data driven »
Savoir-faire en cours…
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
57. Merci de votre attention !
Questions ?
JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr