Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What the Graph?

What the Graph?

Neo4j and Spring Data Neo4j presentation given at #springio_19

Gerrit Meier

May 16, 2019
Tweet

More Decks by Gerrit Meier

Other Decks in Programming

Transcript

  1. 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
  2. Graph Databases Person KNOWS {
 name: “Mr. X” dob: 26.02.1982


    } {
 met: “Spring IO” contact: 16.05.2019
 }
  3. 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.
  4. Connect to Neo4j •Bolt - Binary protocol •HTTP - First

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

    - connector written in C •Community drivers - R, Rust, Elixir…
  6. Neo4j-OGM •Annotations - Describe your Graph •Configuration - Driver, Domain

    packages,… •Mapping - Java Object Graph <> Graph Model •Basic Data Access - CRUD operations built-in
  7. 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; }
  8. Neo4j-OGM :INTERESTED_IN @NodeEntity public class Topic { @Id @GeneratedValue private

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

    = new Person(“Mr. X”); person.addTopic(new Topic(“Spring”)); session.save(person);
  10. 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”) );
  11. 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
  12. Spring Data Neo4j •CRUD Methods - save, findById, delete, count…

    •Graph specific - depth as “second” parameter interface PersonRepository extends Neo4jRepository<Person, Long> {}
  13. 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
  14. 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); }
  15. The Don’ts •Complex Custom Cypher •Batch Operations •Domain Model does

    not represent the Graph •Unwrapping the Session / Driver all the time
  16. 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,…
  17. 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
  18. 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 !-> {!/*!..!*/});
  19. 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; }
  20. 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