{"id":2798,"date":"2023-01-16T21:11:26","date_gmt":"2023-01-16T20:11:26","guid":{"rendered":"https:\/\/informatik.htwk-leipzig.de\/seminar\/?p=2798"},"modified":"2023-02-04T22:46:16","modified_gmt":"2023-02-04T21:46:16","slug":"neo4j","status":"publish","type":"post","link":"https:\/\/informatik.htwk-leipzig.de\/seminar\/lehrveranstaltungen\/betriebliche-informationssysteme\/2023\/neo4j\/","title":{"rendered":"Neo4j"},"content":{"rendered":"<h1><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2825\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/Neo4j-logo_color.png\" alt=\"\" width=\"333\" height=\"125\" \/><\/h1>\n<h2>\u00dcbersicht und Anwendung<span class=\"Apple-converted-space\">\u00a0<\/span><\/h2>\n<p>Neo4j ist eine Platform f\u00fcr eine Vielzahl von Softwareprodukten und Dienstleistungen, in deren Kern das Graphdatenbank-Verwaltungssystem Neo4j DB steht. Es ist auf das Traversieren von Graphen optimiert. Damit eignet sich Neo4j daf\u00fcr, stark vernetzte oder hierarchische Datenstrukturen zu speichern, abzufragen und Datenrelationen zu analysieren. Typische Anwendungsgebiete sind beispielsweise Empfehlungssysteme, Speichern und Analysieren von Sozialen Netzwerken oder das \u00dcberwachen von Lieferketten.<\/p>\n<p>Weitere Produkte und Dienste die unter Neo4j angeboten werden:<\/p>\n<ul>\n<li>Neo4j Graph Data Science: Eine Softwareplattform die Algorithmen sowie Modelle des Maschinenellen Lernens f\u00fcr die Analyse von Graphen bereit stellt.<\/li>\n<li>Neo4j Bloom: Eine integrierte Anwendung f\u00fcr interaktive Visualisierungen von Graphen.<\/li>\n<li>Cypher Query Language: Eine Abfragesprache f\u00fcr Graphdatenbanken.<\/li>\n<li>Neo4j Connectors and Integrators: Zur Integration in die bestehende Softwarearchitektur.<\/li>\n<li>Neo4j Developer Tools: Eine Reihe von Anwendungen, welche die Arbeit mit Neo4j erleichtern soll.<\/li>\n<\/ul>\n<p>Angeboten und verwaltet werden diese von dem gleichnamigen Unternehmen. Im folgenden Text soll mit dem Begriff auf die Softwareprodukte und Dienste verwiesen werden. Die Bereitstellung von Neo4j kann auf einem lokalen Server oder \u00fcber Cloud-Dienstleistungen wie AuraDB erfolgen.<\/p>\n<h2>Datenmodell<\/h2>\n<p>Neo4j speichert Daten in der Struktur von Graphen. Es werden damit sowohl Daten als auch deren Relationen zueinander festgehalten. Die Knoten bestehen aus mindestens einem \u201clabel\u201c, sowie \u201eproperties\u201c.Die gerichteten Kanten bestehen aus genau einem \u201etype\u201c und \u201eproperties\u201c. Eigenschaften von Knoten und Kanten sind durch Paare von Eigenschaftbezeichnung und Wert repr\u00e4sentiert.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2800\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/PropertyValueModel.png\" alt=\"\" width=\"657\" height=\"208\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Abfragen mit Cypher<\/h2>\n<p>In Neo4j k\u00f6nnen komplexe Abfragen mittels der deklarativen Abfragesprache \u201eCypher\u201c durchgef\u00fchrt werden.\u00a0Mit Cypher-Ausdr\u00fccken deklariert ein Anwender Eigenschaften eines gesuchten Musters. Die Datenbank-Engine traversiert dementsprechend alle notwendigen Pfade und gibt das Resultat zur\u00fcck. Damit k\u00f6nnen Daten und Relationen gesucht, erstellt, ver\u00e4ndert, zusammengef\u00fchrt und gel\u00f6scht werden. Die Deklaration eines gesuchten Musters beginnt mit dem Keyword MATCH. Nach WHERE k\u00f6nnen Bedingungen formuliert werden, nach denen die Ergebnisse gefiltert werden. Mit RETURN wird spezifiziert welche Resultate zur\u00fcckgegeben werden.<\/p>\n<p>Beispiele:<\/p>\n<p>Gebe alle Werte der Eigenschaft \u201eproperty2\u201c zur\u00fcck, von all jenen Knoten, welche die Eigenschaft \u201eproperty1\u201c mit dem Wert \u201esome string value\u201c belegt haben.<\/p>\n<pre>MATCH (var : Label)\r\nWHERE var.property1 = \u201esome string value\u201c\r\nRETURN var.property2<\/pre>\n<p>Nach Eigenschaften kann auch direkt durch MATCH gefiltert werden.<\/p>\n<pre>MATCH (var : Label\u00a0{property1 = \u201esome string value\u201c})\r\nRETURN var<\/pre>\n<p>Gebe aufsteigend alle Werte der Eigenschaft \u201er_property\u201c zur\u00fcck, von Relationen des Typs \u201etype1\u201c zwischen zwei Knoten A und B. A muss das Label \u201eLabel1\u201c tragen. B muss das Label \u201eLabel2\u201c tragen.<\/p>\n<pre>MATCH (:Label1)-[rvar : type1]-&gt; (:Label2)\r\nRETURN rvar.r_property AS r_prop\r\nORDER BY r_prop ASC<\/pre>\n<p>Wie anhand dieser Beispiele zu sehen ist, werden Knoten durch Klammern repr\u00e4sentiert<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<pre>(node_variable : Label, \u2026 {property : value, \u2026 })<span class=\"Apple-converted-space\">\u00a0<\/span><\/pre>\n<p>und Relationen durch einen grafischen Pfeil, in dessen Mitte eckige Klammern stehen.<\/p>\n<pre>-[relation_variable : type {property : value, \u2026 }]-&gt;\r\n\r\n<\/pre>\n<h2>BPMN-Modell<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2813\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/Modell_BPMN.png\" alt=\"\" width=\"5204\" height=\"2276\" \/><\/p>\n<p>Das Modell bildet den Prozess der Produktempfehlung eines fiktiven Online-Einzelhandels ab. Teilnehmer an diesem Prozess sind Kunden, die Abteilung &#8222;Einkauf&#8220;, die Abteilung &#8222;Marketing &amp; Verkauf&#8220;, sowie eine Graphdatenbank.<\/p>\n<h2>Praxisbeispiel<\/h2>\n<p>Im folgenden wird beispielhaft die Nutzung der Neo4j DB in Bezug zu diesem Modell aufgezeigt. Dazu werden au\u00dferdem Docker und Neo4j Browser verwendet.\u00a0In diesem Praxisbeispiel wird Neo4j \u00fcber ein Dockerimage bereitgestellt. Im ersten Schritt muss dazu also Docker installiert und gestartet werden. Dann kann in der Kommandozeile \u00fcber folgenden Befehl ein neuer Dockercontainer mit einem Neo4j-Image erstellt und aktiviert werden.<\/p>\n<pre>docker run -p 7474:7474 -p 7687:7687 \\\r\n--name=neo4j_demo\r\n--volume=$HOME\/neo4j\/data:\/data \\\r\n--volume=$HOME\/neo4j\/data\/imports:\/var\/lib\/neo4j\/import \\\r\n--env NEO4J_AUTH=none \\\r\nneo4j:latest<\/pre>\n<p>Dabei werden auch Ports, der Name des Containers, Ordner f\u00fcr Daten und Import, Passworteinstellungen sowie die Version des Neo4j Image spezifiziert. Sobald der Container gestartet ist, kann Neo4j \u00fcber Neo4j Browser unter der Adresse http:\/\/localhost:7474\/browser\/ verwendet werden. Neo4j Browser ist visuell in einzelnen Zellen organisiert, die jeweils aus einer Kommandozeile f\u00fcr Cypher-Audr\u00fccke bestehen. Sobald eine Abfrage gestellt wird, wird die entsprechende Zelle um ein Ausgabefenster erweitert.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2807\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/00_start_desktop.png\" alt=\"\" width=\"531\" height=\"396\" \/><\/p>\n<p>Das BPMN-Modell beginnt damit, dass Kunden des Online-Einzelhandels ein Kundenprofil anlegen. Dabei wird in der Graphdatenbank ein neuer Knoten erstellt, der den Kunden repr\u00e4sentiert.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2808\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/01_NutzerSRC_createprofile.png\" alt=\"\" width=\"2524\" height=\"1102\" \/><\/p>\n<p>Damit ein Kunde Produktdaten abfragen und K\u00e4ufe t\u00e4tigen kann, muss die Abteilung &#8222;Einkauf&#8220; diese Produktdaten in die Datenbank einpflegen. Die Daten k\u00f6nnten dabei beispielsweise bereits als CSV-Datei (&#8222;product_nodes.csv&#8220;) vorliegen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2809\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/02_create_Load_product_data.png\" alt=\"\" width=\"2530\" height=\"1242\" \/><\/p>\n<p>Im n\u00e4chsten Schritt kann ein Kunde ein Produkt kaufen und erstellt damit eine Relation zwischen dem Knoten der ihn repr\u00e4sentiert und dem gekauften Produkt.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2810\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/03_buy_createrelation.png\" alt=\"\" width=\"2514\" height=\"1088\" \/><\/p>\n<p>Wenn diese Prozesse von mehreren Kunden durchlaufen werden, entsteht damit eine vernetzte Datenstruktur. In diesem Praxisbeispiel wird von einer minimalen Anzahl von zwei Kunden ausgegangen, die notwendig ist, um mit dem gew\u00e4hlten Empfehlungsverfahren eine Produktempfehlung ausf\u00fchren zu k\u00f6nnen. Die vollst\u00e4ndige Datenbank k\u00f6nnte dann so aussehen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2811\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/04_full_database.png\" alt=\"\" width=\"2526\" height=\"1086\" \/><\/p>\n<p>Die Kunden &#8222;TAR&#8220; und &#8222;SRC&#8220; kaufen beide das Produkt &#8222;PROD_B&#8220;. Kunde &#8222;SRC&#8220; kauft au\u00dferdem auch &#8222;PROD_A&#8220;. Keiner der beiden Kunden entscheidet sich f\u00fcr &#8222;PROD_C&#8220;. Wie hier zu sehen ist, zeigen die beiden Kunden \u00dcberschneidungen in ihren Kaufentscheidungen. Au\u00dferdem existiert eine transitive Relation zwischen den Knoten &#8222;TAR&#8220; und &#8222;PRO_A&#8220; \u00fcber die Knoten &#8222;PROD_B&#8220; und &#8222;SRC&#8220;. F\u00fcr die Abteilung &#8222;Marketing &amp; Verkauf&#8220; ist es von Interesse solche Muster zu identifizieren, wenn sie davon ausgehen, dass der Kunde &#8222;TAR&#8220; ebenfalls ein Interesse an &#8222;PROD_A&#8220; haben k\u00f6nnte. Dazu k\u00f6nnen sie eine entsprechende Cypher-Abfrage an die Datenbank stellen und sich das zu empfehlende Produkt sowie den potentiellen K\u00e4ufer zur\u00fcckgeben lassen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2812\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2023\/01\/05_find_transitive_relation.png\" alt=\"\" width=\"2522\" height=\"1142\" \/><\/p>\n<h2>Alternativen<\/h2>\n<p>Es existiert eine Vielzahl von Plattformen mit Softwareprodukten und Dienstleistungen um Graphdatenbanken. Im folgenden sind einige prominente Beispiele aufgelistet.<\/p>\n<ul>\n<li>Dgraph<\/li>\n<li>Amazon Neptune<\/li>\n<li>Tiger Graph<\/li>\n<li>OrientDB<\/li>\n<\/ul>\n<h2>Fazit<\/h2>\n<p>Neo4j ist eine weit bekannte und etablierte Platform rund um Graphdatenbanken. Au\u00dferdem existiert eine umfassende und gepflegte Dokumentation, sowie eine aktive Nutzergemeinschaft. Viele der Angebote legen den Fokus auf einen einfachen Einstieg oder Lesbarkeit beispielsweise durch grafische Oberfl\u00e4chen, Visualisierung von Graphen oder visuelle Analogien in der Abfragesprache Cypher.<\/p>\n<h2>Quellen<\/h2>\n<p><a href=\"https:\/\/neo4j.com\/\">h<\/a><a href=\"https:\/\/neo4j.com\/product\/\">ttps:\/\/neo4j.com\/product<\/a><\/p>\n<p><a href=\"https:\/\/neo4j.com\/docs\/\">https:\/\/neo4j.com\/docs\/<\/a>\u00a0(mit allen Unterseiten)<\/p>\n<p>Andreas Meier, Michael Kaufmann (2016). SQL- &amp; NoSQL-Datenbanken (8. Auflage). SpringerVieweg<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00dcbersicht und Anwendung\u00a0 Neo4j ist eine Platform f\u00fcr eine Vielzahl von Softwareprodukten und Dienstleistungen, in deren Kern das Graphdatenbank-Verwaltungssystem Neo4j<\/p>\n","protected":false},"author":125,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2798","post","type-post","status-publish","format-standard","hentry","category-betriebliche-informationssysteme"],"_links":{"self":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/2798","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/users\/125"}],"replies":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/comments?post=2798"}],"version-history":[{"count":10,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/2798\/revisions"}],"predecessor-version":[{"id":2992,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/2798\/revisions\/2992"}],"wp:attachment":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/media?parent=2798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/categories?post=2798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/tags?post=2798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}