$(Graph Meetup)> who am i
Florent Biville (@fbiville)
(Développeur [OSS]|formateur|associé) à
Co-créateur de Spring Meetup...
Spring Data Neo4j - au menu
1. Spring ?
2. Spring Data ?
3. Spring Data Neo4j ?
Spring ?
Spring
À ses débuts (2003)
Spring == Spring Framework == framework de DI
Dependency Injection - brefs rappels
Spring
public class InstantMessagingClient implements MessagingClient {
private final InstantMessagingService instantMessagingSer...
public class InstantMessagingClient implements MessagingClient {
private final InstantMessagingService instantMessagingSer...
Dependency Injection - idée
Ne pas assembler InstantMessagingClient soi-
même, déléguer plutôt à une brique logicielle tie...
Dependency Injection - intérêts
Découpler son logiciel d’un “assemblage” particulier de
InstantMessagingClient (ex: assemb...
Dependency Injection - avec Spring Framework
Spring
Notion de bean = description d’un “assemblage” = recette
de créations d’objets
Notion de context = groupe de beans
Plusieu...
Déclaration de context en XML Déclaration de context en Java
<beans[...]>
<import resource=”classpath:my-services.xml” />
...
Dependency Injection par annotation
Côté contexte : <component-scan /> (XML) ou @ComponentScan (Java) permet de
scanner to...
À ses débuts (2003)
Spring == Spring Framework == framework de DI
Devient un standard de facto (vs. le standard officiel J...
Depuis,
Spring = écosystème alternatif|complémentaire à Java EE
Spring
Spring
La plupart des briques logicielles de l’écosystème Spring
repose sur Spring Framework...
Spring
… dont Spring Data !
Spring
Spring Data ?
Contexte historique
Hégémonie des RDBMS jusqu’à il y a “peu” (NOSQL!).
Impacts côté Java,
hégémonie des ORM (Hibernate, Ec...
Philosophie
Concilier
la familiarité des API comme JPA,
la flexibilité de Spring Framework,
les spécificités d’un maximum ...
Spring Data
Spring Data
Objection !
Spring Data
Les ORM peuvent s’appuyer
sur le standard SQL commun aux SGDBR.
Spring Data
Il n’existe aucun standard partagé par les stores NOSQL.
Spring Data
Comment Spring Data peut-il
prétendre à une API homogène
autour de stores NOSQL qui ne le
sont pas ?
Spring Data
Spring Data Commons - idée
Module parent de tous les modules Spring Data.
Regroupe les traits communs des stores supportés...
Entité ~ description orientée objet d’un enregistrement
Repository ~ encapsulation des opérations de
requêtage sur une col...
Spring Data Commons - entités
Spring Data
Notion de mapping
représentation objet (entité) <-> représentation du store
chaque module SD implémente son propre mapping...
Spring Data Commons - repositories
Spring Data
Encapsule les contrats d’opérations de requêtage
communes à la plupart des stores : écriture, lecture, mise à
jour…
Ces op...
Spring Data
Repository<T,
ID>
Interface “marker” permettant de
déclencher l’inclusion de ses
implémentations
automatiqueme...
Méthodes finder dynamiques
Idée : déduire (au runtime) l’implémentation des
méthodes de Repository par leur signature (mer...
public interface PersonRepository extends Repository<Person, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddre...
@Service
public class JdbcPersonService implements PersonService {
private final PersonRepository repository;
@Autowired
p...
Méthodes finder dynamiques
Aucune écriture d’implémentation de PersonRepository !
Les développeurs se focalisent sur le co...
Spring Data
Repository<T,
ID>
Interface “marker” permettant de
déclencher l’inclusion de ses
implémentations
automatiqueme...
Spring Data
Repository<T,
ID> Définit les opérations
élémentaires sur les entités
(création, lecture, mise à jour,
suppres...
Spring Data
Repository<T,
ID>
Introduit des critères de tri &
pagination sur les requêtes de
lecture globale.
CrudReposito...
Spring Data
Repository<T,
ID>
T = type de l’entité
ID = type de l’identifiant technique
CrudRepository<T,
ID>
PagingAndSor...
Comment Spring Data peut-il
prétendre à une API homogène
autour de stores NOSQL qui ne le
sont pas ?
Spring Data
En introduisant
1 API commune minimaliste
Mais aussi des extensions d’
API par type de store !
Spring Data
Exemple d’utilisation : Redbasin (article)
Idée : concilier l’immensité des informations disponibles
autour de la recherch...
Spring Data Neo4j ?
Module fils (historique!) de Commons
dédié à l’interfaçage avec … Neo4j,
fournit des entités, repositories,
templates orie...
Version actuelle : 3.1.0.RELEASE.
Depuis 3.0.0.RELEASE (24 février 2014),
Neo4j 2.0 est officiellement supporté.
Spring Da...
Spring Data Neo4j - mapping & entités
Spring Data Neo4j
Deux types d’entités : @NodeEntity, @RelationshipEntity
Deux modes de mapping : simple & avancé
Plusieurs stratégies de re...
Entités
@NodeEntity, @RelationshipEntity
Support basique de la JSR-303 (Bean Validation)
Projection de résultats de traver...
@NodeEntity
public class Person {
@GraphId // Optionnel si utilisation du mapping avancé
private Long nodeId;
@Indexed(uni...
@RelationshipEntity(type = "ACTS_IN")
public class Role {
@GraphId
private Long id;
@EndNode
private Movie movie;
@StartNo...
Mapping avancé
Idée : intercepter les accès aux entités (classes
annotées @NodeEntity ou @RelationshipEntity) afin de les
...
Mapping avancé
Aspects Neo4jRelationshipBacking et Neo4jNodeBacking.
Introduction d’un champ EntityState (~noeud /
relatio...
Mapping simple
Chaque classe entité inclut explicitement un champ
annoté @GraphId (nécessairement de type Long) où sera
pe...
Mapping, côté graphe
Différentes stratégies de représentation possibles.
Spring Data Neo4j
Noeud <-> @NodeEntity Relation ...
Mapping, côté graphe
LabelBased (défaut pour noeuds): chaque noeud se voit
assigner un label correspondant au nom qualifié...
Mapping, côté graphe
IndexBased (défaut pour rels): un index __types__ est
créé où sont indexés les champs __type__ ajouté...
Mapping, côté graphe
SubReference (legacy): l’arbre d’entités Java est
persisté comme un sous-graphe dans Neo4j. Les
noeud...
Mapping, côté graphe
Noop : ne fait rien (principalement utilisé pour les tests
internes à SDN) :)
Spring Data Neo4j
Le mapping entités-graphe est déclenché via l’utilisation
des repositories ou de Neo4jTemplate.
Spring Data Neo4j
Spring Data Neo4j - repositories
Spring Data Neo4j
Spring Data Neo4j
Repository<T,
ID>
CrudRepository<T,
ID>
PagingAndSortingRepository<T, ID>
GraphRepository<T>
Outre les o...
Spring Data Neo4j
// côté repository
public interface TweetRepository extends GraphRepository<Tweet> {
List<Tweet> findByP...
Il est également possible de définir des requêtes Cypher
particulières (toujours pas d’implémentation à écrire !)
public i...
Il existe aussi d’autres repositories tels que
SpatialRepository (requêtes géospatiales),
CypherDslRepository<T> pour util...
Spring Data Neo4j - template
Spring Data Neo4j
Encapsule l’API Neo4j avec une gestion implicite des
transactions (et une optimisation des requêtes HTTP en
mode REST).
Pe...
Spring Data Neo4j - cross-store persistence
Spring Data Neo4j
Permet de persister une partie des informations portée par
les entités dans Neo4j et l’autre dans un SGDBR (via JPA).
Spri...
L’entité ne sera persistée dans le graphe qu’une fois
persistée dans le SGDBR (ID JPA assigné). Un champ
FOREIGN_ID (FQN +...
@Entity // JPA
@NodeEntity(partial = true) // Spring Data Neo4j
public class User {
@Id
@GeneratedValue(strategy = Generat...
Conclusion
?Ça continue sur Twitter (@fbiville, @LateraIThoughts, @Neo4jFr),
le Google Groups Neo4jFR,
les meetups… ;-)
[FR] Introduction à Spring Data Neo4j 3.x
Upcoming SlideShare
Loading in …5
×

[FR] Introduction à Spring Data Neo4j 3.x

853 views
718 views

Published on

22nd of May - Graph DB Meetup @ Lyon, FR
Contents in French this time
Details all capabilities offered by Neo4j.

More info : http://www.meetup.com/graphdb-Lyon/events/175401022/

Please not all attendants were techies, that's why I felt compelled to remind what Spring is and is not.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
853
On SlideShare
0
From Embeds
0
Number of Embeds
25
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

[FR] Introduction à Spring Data Neo4j 3.x

  1. 1. $(Graph Meetup)> who am i Florent Biville (@fbiville) (Développeur [OSS]|formateur|associé) à Co-créateur de Spring Meetup Paris (@interface21_ug) Partenaire @Neo4j depuis 2012 (& formateur Neo4j !)
  2. 2. Spring Data Neo4j - au menu 1. Spring ? 2. Spring Data ? 3. Spring Data Neo4j ?
  3. 3. Spring ?
  4. 4. Spring À ses débuts (2003) Spring == Spring Framework == framework de DI
  5. 5. Dependency Injection - brefs rappels Spring
  6. 6. public class InstantMessagingClient implements MessagingClient { private final InstantMessagingService instantMessagingService; private final UserSessionService userSessionService; public InstantMessagingClient(InstantMessagingService instantMessagingService, UserSessionService userSessionService) { this.instantMessagingService = instantMessagingService; this.userSessionService = userSessionService; } public void sendMessage(Message message) { if (userSessionService.isCurrentlyLogged(message.getAuthorName())) { instantMessagingService.sendMessage(message); } } } Spring
  7. 7. public class InstantMessagingClient implements MessagingClient { private final InstantMessagingService instantMessagingService; private final UserSessionService userSessionService; public InstantMessagingClient(InstantMessagingService instantMessagingService, UserSessionService userSessionService) { this.instantMessagingService = instantMessagingService; this.userSessionService = userSessionService; } public void sendMessage(Message message) { if (userSessionService.isCurrentlyLogged(message.getAuthorName())) { instantMessagingService.sendMessage(message); } } } Spring
  8. 8. Dependency Injection - idée Ne pas assembler InstantMessagingClient soi- même, déléguer plutôt à une brique logicielle tierce. Spring
  9. 9. Dependency Injection - intérêts Découpler son logiciel d’un “assemblage” particulier de InstantMessagingClient (ex: assembler un service de tests pour les tests automatisés) Spring
  10. 10. Dependency Injection - avec Spring Framework Spring
  11. 11. Notion de bean = description d’un “assemblage” = recette de créations d’objets Notion de context = groupe de beans Plusieurs formats de description : XML (historique), Java, annotations Java Spring
  12. 12. Déclaration de context en XML Déclaration de context en Java <beans[...]> <import resource=”classpath:my-services.xml” /> <bean id=”instantMessagingClient” class=”com. acme.InstantMessagingClient”> <constructor-arg ref=”instantMsgService” /> <constructor-arg ref=”userSessionService” /> </bean> </beans> @Configuration @Import(MyServiceContext.class) public class MyProductionContext { @Bean public MessagingClient instantMessagingClient (InstantMessagingService msgService, UserSessionService userService) return new InstantMessagingClient( msgService, userService ); } Spring
  13. 13. Dependency Injection par annotation Côté contexte : <component-scan /> (XML) ou @ComponentScan (Java) permet de scanner tout un ensemble de beans sans avoir à les déclarer explicitement. @Component public class InstantMessagingClient implements MessagingClient { [...] @Autowired // ou @Inject (standard Java EE) public InstantMessagingClient(InstantMessagingService instantMessagingService, UserSessionService userSessionService) { [...] } [...] } Spring
  14. 14. À ses débuts (2003) Spring == Spring Framework == framework de DI Devient un standard de facto (vs. le standard officiel J2EE) Spring
  15. 15. Depuis, Spring = écosystème alternatif|complémentaire à Java EE Spring
  16. 16. Spring
  17. 17. La plupart des briques logicielles de l’écosystème Spring repose sur Spring Framework... Spring
  18. 18. … dont Spring Data ! Spring
  19. 19. Spring Data ?
  20. 20. Contexte historique Hégémonie des RDBMS jusqu’à il y a “peu” (NOSQL!). Impacts côté Java, hégémonie des ORM (Hibernate, EclipseLink...) émergence d’un standard (JPA) Spring Data
  21. 21. Philosophie Concilier la familiarité des API comme JPA, la flexibilité de Spring Framework, les spécificités d’un maximum de stores NOSQL. Spring Data
  22. 22. Spring Data
  23. 23. Spring Data
  24. 24. Objection ! Spring Data
  25. 25. Les ORM peuvent s’appuyer sur le standard SQL commun aux SGDBR. Spring Data
  26. 26. Il n’existe aucun standard partagé par les stores NOSQL. Spring Data
  27. 27. Comment Spring Data peut-il prétendre à une API homogène autour de stores NOSQL qui ne le sont pas ? Spring Data
  28. 28. Spring Data Commons - idée Module parent de tous les modules Spring Data. Regroupe les traits communs des stores supportés. Définit les concepts partagés de base. Spring Data
  29. 29. Entité ~ description orientée objet d’un enregistrement Repository ~ encapsulation des opérations de requêtage sur une collection d’objets (ici : entités) Template ~ encapsulation des opérations bas niveau spécifiques à un service particulier (JdbcTemplate…) Spring Data
  30. 30. Spring Data Commons - entités Spring Data
  31. 31. Notion de mapping représentation objet (entité) <-> représentation du store chaque module SD implémente son propre mapping exemples : @NodeEntity (SD Neo4j), @Document (SD Mongo)... Spring Data
  32. 32. Spring Data Commons - repositories Spring Data
  33. 33. Encapsule les contrats d’opérations de requêtage communes à la plupart des stores : écriture, lecture, mise à jour… Ces opérations sont réparties dans une hiérarchie d’ interfaces Java. Spring Data
  34. 34. Spring Data Repository<T, ID> Interface “marker” permettant de déclencher l’inclusion de ses implémentations automatiquement et la génération de méthodes finder dynamiques. T = type de l’entité ID = type de l’identifiant technique
  35. 35. Méthodes finder dynamiques Idée : déduire (au runtime) l’implémentation des méthodes de Repository par leur signature (merci Ruby on Rails). Spring Data
  36. 36. public interface PersonRepository extends Repository<Person, Long> { List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname); List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findByLastnameIgnoreCase(String lastname); List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); List<Person> findByLastnameOrderByFirstnameAsc(String lastname); List<Person> findByLastnameOrderByFirstnameDesc(String lastname); } Spring Data
  37. 37. @Service public class JdbcPersonService implements PersonService { private final PersonRepository repository; @Autowired public PersonService(PersonRepository repository) { this.repository = repository; } @Transactional public List<Person> findByLastnameIgnoreCase(String lastName) { return repository.findByLastnameIgnoreCase(lastName); } // [...] } Spring Data
  38. 38. Méthodes finder dynamiques Aucune écriture d’implémentation de PersonRepository ! Les développeurs se focalisent sur le code métier (JdbcPersonService). Spring Data
  39. 39. Spring Data Repository<T, ID> Interface “marker” permettant de déclencher l’inclusion de ses implémentations automatiquement et la génération de méthodes finder dynamiques. T = type de l’entité ID = type de l’identifiant technique
  40. 40. Spring Data Repository<T, ID> Définit les opérations élémentaires sur les entités (création, lecture, mise à jour, suppression). CrudRepository<T, ID> T = type de l’entité ID = type de l’identifiant technique
  41. 41. Spring Data Repository<T, ID> Introduit des critères de tri & pagination sur les requêtes de lecture globale. CrudRepository<T, ID> PagingAndSortingRepository<T, ID> T = type de l’entité ID = type de l’identifiant technique
  42. 42. Spring Data Repository<T, ID> T = type de l’entité ID = type de l’identifiant technique CrudRepository<T, ID> PagingAndSortingRepository<T, ID> Chaque module Spring Data (et chaque développeur!) est ensuite libre non seulement d’ implémenter mais de spécialiser ces contrats transverses.
  43. 43. Comment Spring Data peut-il prétendre à une API homogène autour de stores NOSQL qui ne le sont pas ? Spring Data
  44. 44. En introduisant 1 API commune minimaliste Mais aussi des extensions d’ API par type de store ! Spring Data
  45. 45. Exemple d’utilisation : Redbasin (article) Idée : concilier l’immensité des informations disponibles autour de la recherche de traitements contre le cancer pour détecter au plus vite les traitements inefficaces. Utilisation de Spring Data pour Neo4j/Mongo DB/Redis/Hadoop. Spring Data
  46. 46. Spring Data Neo4j ?
  47. 47. Module fils (historique!) de Commons dédié à l’interfaçage avec … Neo4j, fournit des entités, repositories, templates orientés graphe ! Spring Data Neo4j
  48. 48. Version actuelle : 3.1.0.RELEASE. Depuis 3.0.0.RELEASE (24 février 2014), Neo4j 2.0 est officiellement supporté. Spring Data Neo4j
  49. 49. Spring Data Neo4j - mapping & entités Spring Data Neo4j
  50. 50. Deux types d’entités : @NodeEntity, @RelationshipEntity Deux modes de mapping : simple & avancé Plusieurs stratégies de représentation des métadonnées de mapping au sein du graphe. Spring Data Neo4j
  51. 51. Entités @NodeEntity, @RelationshipEntity Support basique de la JSR-303 (Bean Validation) Projection de résultats de traversées possible (via FieldTraversalDescriptionBuilder). Cycle de vie à la JPA : detached, attached. Spring Data Neo4j
  52. 52. @NodeEntity public class Person { @GraphId // Optionnel si utilisation du mapping avancé private Long nodeId; @Indexed(unique=true) // Index façon 2.0 private String id; @Indexed(indexType = IndexType.FULLTEXT, indexName = "people") // Index legacy @Size(min = 2, max = 50) // JSR-303 private String name; @RelatedTo(type="OWNS", enforceTargetType=true) // @RelationshipEntity non requise private Car car; @RelatedToVia(type="FRIEND_OF", direction=Direction.INCOMING) private Iterable<Friendship> friendships; // [...] constructeurs, getters/setters, equals/hashCode } Spring Data Neo4j
  53. 53. @RelationshipEntity(type = "ACTS_IN") public class Role { @GraphId private Long id; @EndNode private Movie movie; @StartNode private Actor actor; private String name; // implicitement persisté (version explicite : @GraphProperty) @GraphTraversal(traversal=PeopleTraversalBuilder.class, params="persons") private Iterable<Relationship> peopleRelationships; // [...] constructeurs, getters/setters, equals/hashCode } Spring Data Neo4j
  54. 54. Mapping avancé Idée : intercepter les accès aux entités (classes annotées @NodeEntity ou @RelationshipEntity) afin de les enrichir d’informations supplémentaires. Spring Data Neo4j
  55. 55. Mapping avancé Aspects Neo4jRelationshipBacking et Neo4jNodeBacking. Introduction d’un champ EntityState (~noeud / relation sous-jacente) et de méthodes de persistence (Active Record). Spring Data Neo4j
  56. 56. Mapping simple Chaque classe entité inclut explicitement un champ annoté @GraphId (nécessairement de type Long) où sera persisté l’ID technique des noeuds/relations. Spring Data Neo4j
  57. 57. Mapping, côté graphe Différentes stratégies de représentation possibles. Spring Data Neo4j Noeud <-> @NodeEntity Relation <-> @RelationshipEntity LabelBasedNodeTypeRepresentationStrategy IndexBasedRelationshipTypeRepresentationStrategy IndexBasedNodeTypeRepresentationStrategy SubReferenceNodeTypeRepresentationStrategy NoopRelationshipTypeRepresentationStrategy NoopNodeTypeRepresentationStrategy
  58. 58. Mapping, côté graphe LabelBased (défaut pour noeuds): chaque noeud se voit assigner un label correspondant au nom qualifié (ou aliasé) de son entité Java. Spring Data Neo4j
  59. 59. Mapping, côté graphe IndexBased (défaut pour rels): un index __types__ est créé où sont indexés les champs __type__ ajouté automatiquement aux noeuds/relations Spring Data Neo4j
  60. 60. Mapping, côté graphe SubReference (legacy): l’arbre d’entités Java est persisté comme un sous-graphe dans Neo4j. Les noeuds du graphe s’y lient avec des relations de type INSTANCE_OF. Il annule le mapping des relations (cf. Noop). Spring Data Neo4j
  61. 61. Mapping, côté graphe Noop : ne fait rien (principalement utilisé pour les tests internes à SDN) :) Spring Data Neo4j
  62. 62. Le mapping entités-graphe est déclenché via l’utilisation des repositories ou de Neo4jTemplate. Spring Data Neo4j
  63. 63. Spring Data Neo4j - repositories Spring Data Neo4j
  64. 64. Spring Data Neo4j Repository<T, ID> CrudRepository<T, ID> PagingAndSortingRepository<T, ID> GraphRepository<T> Outre les opérations de base, cette interface expose les opérations d’indexations (pre- et post-2.0) et de traversée via des interfaces intermédiaires (non illustrées ici) comme findAllByTraversal… T = type de l’entité ID = type de l’identifiant technique
  65. 65. Spring Data Neo4j // côté repository public interface TweetRepository extends GraphRepository<Tweet> { List<Tweet> findByPosterName(String poster); } // côté service @Service @Transactional public class TwitterService implements SocialService { @Autowired // préférez par constructeur ou par setter private TweetRepository tweetRepository; @Transactional(readOnly = true) public Tweets findTweetsAuthoredBy(String poster) { return Tweets.of(tweetRepository.findByPosterName(poster)); } }
  66. 66. Il est également possible de définir des requêtes Cypher particulières (toujours pas d’implémentation à écrire !) public interface UserRepository extends GraphRepository<User> { @Query( "MATCH (me:User {user:{name}})-[:POSTED]->(tweet)-[:MENTIONS]->(user)" + " WHERE me <> user " + " RETURN distinct user") Set<User> suggestFriends(@Param("name") String user); } Spring Data Neo4j
  67. 67. Il existe aussi d’autres repositories tels que SpatialRepository (requêtes géospatiales), CypherDslRepository<T> pour utiliser le DSL Cypher Java et des intégrations avec QueryDSL (voire de les combiner). Spring Data Neo4j
  68. 68. Spring Data Neo4j - template Spring Data Neo4j
  69. 69. Encapsule l’API Neo4j avec une gestion implicite des transactions (et une optimisation des requêtes HTTP en mode REST). Permet la manipulation des entités et offre un système basique d’écoute d’événements (Spring Framework) : {Before|After}{Save|Delete}Event Spring Data Neo4j
  70. 70. Spring Data Neo4j - cross-store persistence Spring Data Neo4j
  71. 71. Permet de persister une partie des informations portée par les entités dans Neo4j et l’autre dans un SGDBR (via JPA). Spring Data Neo4j
  72. 72. L’entité ne sera persistée dans le graphe qu’une fois persistée dans le SGDBR (ID JPA assigné). Un champ FOREIGN_ID (FQN + ID JPA) est ensuite ajouté au noeud du graphe. Les aspects de SDN rendent les champs annotés @GraphProperty transients pour JPA. Spring Data Neo4j
  73. 73. @Entity // JPA @NodeEntity(partial = true) // Spring Data Neo4j public class User { @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "id_gen") @TableGenerator(name = "id_gen", table = "SEQUENCE", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "SEQ_GEN", allocationSize = 1) private Long id; // ID JPA private String name; @GraphProperty @Indexed String nickname; @RelatedToVia(type = "recommends", elementClass = Recommendation.class) Iterable<Recommendation> recommendations; } Spring Data Neo4j
  74. 74. Conclusion
  75. 75. ?Ça continue sur Twitter (@fbiville, @LateraIThoughts, @Neo4jFr), le Google Groups Neo4jFR, les meetups… ;-)

×