What the Graph?

What the Graph?

Neo4j and Spring Data Neo4j presentation given at #springio_19

34ecacd077244d141a23c46ea094df5c?s=128

Gerrit Meier

May 16, 2019
Tweet

Transcript

  1. Gerrit Meier @meistermeier What the Graph?

  2. Neo4j

  3. None
  4. Ecosystem Neo4j Professional Services 300+ partners 47,000 group members 61,000

    trained engineers 3.5M downloads Mindset “Graph Thinking” is all about considering connections in data as important as the data itself. Native Graph Platform Neo4j is an internet-scale, native graph database which executes connected workloads faster than any other database management system. Neo4j
  5. Graph Databases

  6. Graph Databases Hero

  7. Graph Databases Label Type

  8. Graph Databases Person KNOWS {
 name: “Mr. X” dob: 26.02.1982


    } {
 met: “Spring IO” contact: 16.05.2019
 }
  9. Graph Databases Person KNOWS Person Topic INTERESTED_IN INTERESTED_IN {
 term:

    “Spring Data” description: “ … “
 }
  10. Data Access

  11. Cypher Cypher Query Language is to Neo4j what 
 SQL

    is for relational databases. Open Source http://www.opencypher.org/ and ready for other Graph Database technology.
  12. Cypher :Person :KNOWS :Person :Topic :INTERESTED_IN :INTERESTED_IN

  13. Cypher Person KNOWS Person Topic INTERESTED_IN INTERESTED_IN MATCH 
 (person:Person)-[:INTERESTED_IN]"->(t:Topic)"<-[:INTERESTED_IN]-(otherPerson:Person)

    WHERE 
 (person)-[:KNOWS]-(otherPerson)
 RETURN
 otherPerson
  14. Connect to Neo4j •Bolt - Binary protocol •HTTP - First

    remote access, no library needed •Embedded - Running Neo4j in the same JVM
  15. Bolt drivers •Languages - Java, Python, JavaScript, C#, Go •Seabolt

    - connector written in C •Community drivers - R, Rust, Elixir…
  16. Neo4j-OGM Java Driver Neo4j-OGM Embedded Bolt HTTP

  17. Neo4j-OGM •Annotations - Describe your Graph •Configuration - Driver, Domain

    packages,… •Mapping - Java Object Graph <> Graph Model •Basic Data Access - CRUD operations built-in
  18. Neo4j-OGM :Person :Topic :INTERESTED_IN

  19. Neo4j-OGM :Topic :INTERESTED_IN @NodeEntity public class Person { @Id @GeneratedValue

    private Long id; @Property private String name; @Relationship(type = “INTERESTED_IN") private Set<Topic> topic; }
  20. Neo4j-OGM :INTERESTED_IN @NodeEntity public class Topic { @Id @GeneratedValue private

    Long id; private String term; private String description; } :Person
  21. Neo4j-OGM :Person :Topic :INTERESTED_IN Session session = sessionFactory.openSession(); Person person

    = new Person(“Mr. X”); person.addTopic(new Topic(“Spring”)); session.save(person);
  22. Neo4j-OGM :Person :Topic :INTERESTED_IN Person person = session.load(Person.class, personId); Collection<Person>

    people = session.loadAll(Person.class);
  23. Neo4j-OGM :Person :Topic :INTERESTED_IN Person person = session.queryForObject(Person.class,
 "MATCH (p:Person)

    where p.name = ${name} return p",
 singletonMap("name", “Mr. X”) );
  24. Spring Data Neo4j

  25. Spring Data Neo4j •Convenient Data Access - Spring Data’s Domain-Driver-Design

    way •Derived Finder Methods - no Cypher needed •Abstraction from Cypher - if wanted •Specialisation for Graph Operations - graph-ish way to work with data
  26. Spring Data Neo4j •CRUD Methods - save, findById, delete, count…

    •Graph specific - depth as “second” parameter interface PersonRepository extends Neo4jRepository<Person, Long> {}
  27. Spring Data Neo4j interface PersonRepository extends Neo4jRepository<Person, Long> { Person

    findByName(String name); }
  28. Spring Data Neo4j interface PersonRepository extends Neo4jRepository<Person, Long> { Person

    findByName(String name); } MATCH 
 (person:Person)-[int:INTERESTED_IN]"->(topic:Topic) WHERE 
 person.name=$name 
 RETURN
 person, int, topic
  29. Spring Data Neo4j interface PersonRepository extends Neo4jRepository<Person, Long> { @Query("MATCH

    (p:Person)-[:INTERESTED_IN]->(t:Topic) WHERE t.term={0} return p”) List<Person> customFindByInterest(String interest); }
  30. Spring Data Neo4j 5.x (Lovelace/Moore) •Spring Boot 2.x only •Schema-based

    Loading •Persistence Constructor
  31. The Don’ts

  32. The Don’ts •Complex Custom Cypher •Batch Operations •Domain Model does

    not represent the Graph •Unwrapping the Session / Driver all the time
  33. Getting started

  34. Import •LOAD CSV - File, HTTP(S) or FTP •APOC -

    Support for JSON, JDBC… •ETL Tool - Import and map data from SQL source WITH “jdbc:mysql://database” AS url CALL apoc.load.jdbc(url) YIELD value UNWIND value.items AS item MERGE (:Item {title=item.title} LOAD CSV WITH HEADERS 
 FROM “file:paradise.csv” AS row CREATE 
 (:Officer {name: row.n.name, country: row.n.country,…
  35. Sandbox

  36. Thanks

  37. Spring Data Neo4j ⚡ RX* *working title

  38. SDN⚡RX •Complete rewrite of Spring Data Neo4j & Neo4j-OGM •(not

    only) Reactive Support •(Reactive)Neo4jClient •Cypher DSL •real Immutable Mapping •new Spring Boot Autoconfiguration
  39. SDN⚡RX Node personNode = node("Person"); Statement statement = match(personNode) .where(personNode.property("name").isEqualTo(literalOf("Mr.X")))

    .returning(personNode) .build();
  40. SDN⚡RX Node personNode = node("Person"); Statement statement = match(personNode) .where(personNode.property("name").isEqualTo(literalOf("Mr.X")))

    .returning(personNode) .build(); ReactiveNeo4jClient client = ReactiveNeo4jClient.create(driver); Flux<Person> people = client .newQuery(renderer.render(statement)) .fetchAs(Person.class) .mappedBy(record !-> {!/*!..!*/}) !// optional mapping .all() .subscribe(person !-> {!/*!..!*/});
  41. SDN⚡RX public class Person { @Id private final Long id;

    private final String name; private Person(Long id, String name) { this.id = id; this.name = name; } public Person withId(Long newId) { return new Person(newId, this.name); } public Person withName(String newName) { return new Person(this.id, newName); } } @AllArgsConstructor public class PersonWithAllConstructor { @Id private final Long id; private final String name; private final String firstName; private final String sameValue; private final Boolean cool; private final Long personNumber; private final LocalDate bornOn; }
  42. SDN⚡RX @Node data class KotlinPerson(@Id val id: Long, val name:

    String)
  43. Links •Neo4j Desktop - https://neo4j.com/download •Neo4j Sandbox - https://neo4j.com/sandbox-v2/ •This

    Talk - https://speakerdeck.com/meistermeier •Free Graph Algorithms book - https://neo4j.com/graph-algorithms-book
  44. Gerrit Meier @meistermeier Thanks!