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 3
• Java Champion • Gründer und aktueller Leiter der Java User Group EuregJUG • Autor (Spring Boot 2 und Arc42 by example) Über mich 4 First contact to Neo4j through
• Dann beginnt die Normalisierung (Redundanzfreiheit als Ziel): • UNF (Nicht normalisiert) • 1NF: Atomare Spalten • 2NF: + Keine teilweisen Abhängigkeiten • 3NF: + Keine transitiven Abhängigkeiten • Und einige mehr… Fremdschlüssel zwischen Tabellen sind keine Relationen! Tabellen und Ergebnismengen von Abfragen sind Relationen. 7
Ländern gegründet und Solokünstler geboren • Einige Künstler sind mit anderen Künstler assoziiert und Bands haben Mitglieder • Künstler veröffentlichen Alben :Artist :Band :SoloArtist :Country :FOUNDED_IN :BORN_IN :ASSOCIATED_WITH :HAS_MEMBER :Album :RELEASED_BY 9
Relationships MATCH Finden von Nodes und Relationships WHERE Constraints für MATCH oder Filter der WITH-Klausel DELETE Löschen von Nodes und Relationships SET Setzen von Eigenschaften REMOVE Löschen von Eigenschaften WITH „Chaining“ von Abfragen
First Version ~2010 (Emil Eifrem, Rod Johnson) • Basiert vollständig auf Neo4j-OGM • Community-Modul, aber Teil des Spring Data Release-Train • Integriert in Spring Boot 34
und Cypher genutzt werden (von Repository oder CrudRepository erben) • Oder „Graph aware“ • Mit eigenen Cypher-Abfragen • @Depth nutzen um Fetch-Tiefe zu begrenzen • von Neo4jRepository erben (Optional!!) 35
var artist = new BandEntity("Queen"); artist.addMember(new SoloArtistEntity("Freddie Mercury")); artist = bandRepository.save(artist); artist = bandRepository.findByName("Nickelback") artist.ifPresent(bandRepository::delete); 37
„Derived finder“ nicht missbrauchen! i.e. Optional<AlbumEntity> findOneByArtistNameAndNameAndLiveIsTrueAndReleasedInValue(String artistName, String name, long year) • Nicht blindlings den Graphen in der Anwendung nachbauen • Das Graph-Model im Sinne der gewünschten Abfragen aufbauen • Das Domain-Model nach Anwendungs-Usecase 41
public class ArtistEntity { private String name; @Relationship( value = "RELEASED_BY", direction = INCOMING) private List<AlbumEntity> albums; } @NodeEntity("Album") public class AlbumEntity { @Relationship("RELEASED_BY") private ArtistEntity artist; @Relationship("CONTAINS") private List<TrackEntity> tracks; } @NodeEntity("Track") public class TrackEntity { @Relationship( value = "CONTAINS", direction = INCOMING) private List<AlbumEntity> tracks; }
know that entities are connected -- they are dependent on each other. The reason why we chose graph technology and Neo4j is because all the entities are connected.“ Dr Alexander Jarasch, DZD German centre of diabetic research 49
datasets • https://neo4j.com/graphgists/ • Neo4j Graph Gists, Example Models and Cypher Queries • https://offshoreleaks.icij.org/ • Data convolutes mentioned early 52
„From relational databases to databases with relations“ https://info.michael-simons.eu/2018/10/11/from-relational-databases-to-databases-with- relations/ • Folien: speakerdeck.com/michaelsimons • Kuratierte Liste von Neo4j, Neo4j-OGM und SDN Tipps: https://github.com/michael-simons/neo4j-sdn-ogm-tips • (German) Spring Boot Book @SpringBootBuch // springbootbuch.de Demo, Doku und Slides 53