{"id":2858,"date":"2014-12-15T00:00:00","date_gmt":"2014-12-15T00:00:00","guid":{"rendered":"https:\/\/structr.com\/erstellen-von-graph-strukturen-aus-tief-verschachtelten-json-dokumenten\/"},"modified":"2025-03-24T13:45:55","modified_gmt":"2025-03-24T13:45:55","slug":"erstellen-von-graph-strukturen-aus-tief-verschachtelten-json-dokumenten","status":"publish","type":"post","link":"https:\/\/structr.com\/de\/blog\/erstellen-von-graph-strukturen-aus-tief-verschachtelten-json-dokumenten\/","title":{"rendered":"Erstellen von Graph-Strukturen aus tief verschachtelten JSON-Dokumenten"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row][vc_column][vc_column_text]Vor kurzem haben wir einige Tests mit der aktuellen Structr-Version durchgef\u00fchrt, um zu sehen, wie gut Structr mit tief verschachtelten JSON-Dokumenten umgehen kann, um Graphenstrukturen in Neo4j zu erstellen. Wir haben herausgefunden, dass es bis zur zweiten Ebene der Objektverschachtelung recht gut funktioniert, und zwar nur dann, wenn neue Objekte entweder \u00fcber ihre UUID oder \u00fcber einen skalaren Wert auf bestehende Objekte verweisen, wenn die entsprechende Zuordnung im Schema definiert wurde. <\/p>\n<p>Wenn es um Attribute von verschachtelten Objekten geht, die von komplexeren Werten referenziert werden, wie Sammlungen oder verschachtelten Objekten selbst, wurde es insofern schwierig, als dass man ein ziemlich komplexes Objekt-Mapping im Schema definieren musste, indem man Dinge wie Notion-Attribute verwendete (unter Verwendung von <code>PropertySetNotion<\/code> intern).<\/p>\n<h3 id=\"was-gibt-es-neues\">Was gibt es Neues?<\/h3>\n<p>In den letzten Tagen hat Christian einige Verbesserungen vorgenommen, um diese Probleme zu entsch\u00e4rfen und die Erstellung von Knoten und Beziehungen in Neo4j basierend auf den Schemaregeln in Structr zu vereinfachen.<\/p>\n<h3 id=\"beispiel\">Beispiel<\/h3>\n<p>Um die neuen M\u00f6glichkeiten zu demonstrieren, haben wir das folgende Beispiel erstellt.<\/p>\n<h4 id=\"schema\">Schema<\/h4>\n<p>[\/vc_column_text][vc_single_image image=&#8220;2859&#8243; img_size=&#8220;large&#8220;][vc_column_text]Die Schemaregeln in Cypher-Notation:<\/p>\n<pre><code>(:Project)-[:TASK]-&gt;(:Task)<\/code><\/pre>\n<pre><code>(:Task)-[:SUBTASK]-&gt;(:Task)<\/code><\/pre>\n<pre><code>(:Task)&lt;-[WORKS_ON]-(:Worker)<\/code><\/pre>\n<pre><code>(:Worker)-&gt;[:WORKS_AT]-&gt;(:Company)<\/code><\/pre>\n<p>Die Kardinalit\u00e4ten sind:<\/p>\n<ul>\n<li>Projekt 1 -&gt; * Aufgabe<\/li>\n<li>Aufgabe 1 -&gt; * Aufgabe<\/li>\n<li>Arbeiter 1 -&gt; * Aufgabe<\/li>\n<li>Arbeiter * -&gt; 1 Unternehmen<\/li>\n<\/ul>\n<p>Damit das Beispiel funktioniert, ist es wichtig, die automatische Benennung zu \u00fcberschreiben und die Attribute genau wie im Beispiel zu benennen: <code>tasks, parentTask, subtasks, company, worker, workers<\/code> usw..<\/p>\n<p>Stellen Sie sicher, dass das Attribut <code>name<\/code> f\u00fcr jeden Typ eindeutig ist.<\/p>\n<h4 id=\"regeln-fuer-die-automatische-erstellung\">Regeln f\u00fcr die automatische Erstellung<\/h4>\n<p>Anstatt eine  <code>PropertyNotion<\/code>  mit  <code>autocreate<\/code>  m\u00fcssen Sie nur die folgenden Regeln f\u00fcr die automatische Erstellung (ALWAYS) im Schema-Editor definieren:<\/p>\n<ul>\n<li>Projekt -&gt; Aufgabe<\/li>\n<li>Aufgabe -&gt; Aufgabe<\/li>\n<li>Arbeiter -&gt; Aufgabe<\/li>\n<li>Arbeiter -&gt; Unternehmen<\/li>\n<\/ul>\n<h4 id=\"json-dokument\">JSON-Dokument<\/h4>\n<p>Das folgende Beispiel-JSON-Dokument enth\u00e4lt alle Informationen \u00fcber die zu erstellenden Objekte. Beachten Sie, dass einige Unterobjekte mehrfach im Dokument vorkommen, und wenn f\u00fcr ihren Typ ein eindeutiges Attribut definiert ist (wie z. B. das Attribut <code>name<\/code> f\u00fcr Projekt, Unternehmen und Arbeitnehmer), wird das Objekt nur einmal erstellt. <\/p>\n<pre><code>{\r\n   \"name\": \"Project1\",\r\n   \"tasks\": [\r\n       {\r\n           \"name\": \"Task1\",\r\n           \"worker\": {\r\n               \"name\": \"Worker1\",\r\n               \"company\": { \r\n                   \"name\": \"Company1\"\r\n               }\r\n           },\r\n           \"subtasks\": [\r\n               {\r\n                   \"name\": \"Subtask1.1\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker1\",\r\n                       \"company\": { \r\n                           \"name\": \"Company1\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask1.2\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker2\",\r\n                       \"company\": { \r\n                           \"name\": \"Company1\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask1.3\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker2\",\r\n                       \"company\": { \r\n                           \"name\": \"Company1\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask1.4\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker3\",\r\n                       \"company\": { \r\n                           \"name\": \"Company2\"\r\n                       }\r\n                   }\r\n               }\r\n           ]\r\n       },\r\n       {\r\n           \"name\": \"Task2\",\r\n           \"worker\": {\r\n               \"name\": \"Worker2\",\r\n               \"company\": { \r\n                   \"name\": \"Company1\"\r\n               }\r\n           }\r\n       },\r\n       {\r\n           \"name\": \"Task3\",\r\n           \"worker\": {\r\n               \"name\": \"Worker3\",\r\n               \"company\": { \r\n                   \"name\": \"Company2\"\r\n               }\r\n           }\r\n       },\r\n       {\r\n           \"name\": \"Task4\",\r\n           \"worker\": {\r\n               \"name\": \"Worker4\",\r\n               \"company\": { \r\n                   \"name\": \"Company3\"\r\n               }\r\n           },\r\n           \"subtasks\": [\r\n               {\r\n                   \"name\": \"Subtask4.1\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker4\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask4.2\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker4\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask4.3\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker4\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   }\r\n               },\r\n               {\r\n                   \"name\": \"Subtask4.4\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker5\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   }\r\n               }\r\n           ]\r\n       },\r\n       {\r\n           \"name\": \"Task5\",\r\n           \"worker\": {\r\n               \"name\": \"Worker5\",\r\n               \"company\": { \r\n                   \"name\": \"Company3\"\r\n               }\r\n           },\r\n           \"subtasks\": [\r\n               {\r\n                   \"name\": \"Subtask5.1\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker4\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   },\r\n                   \"subtasks\": [\r\n                       {\r\n                           \"name\": \"Subtask5.1.1\",\r\n                           \"worker\": {\r\n                               \"name\": \"Worker4\",\r\n                               \"company\": { \r\n                                   \"name\": \"Company3\"\r\n                               }\r\n                           }\r\n                       },\r\n                       {\r\n                           \"name\": \"Subtask5.1.2\",\r\n                           \"worker\": {\r\n                               \"name\": \"Worker4\",\r\n                               \"company\": { \r\n                                   \"name\": \"Company3\"\r\n                               }\r\n                           }\r\n                       }\r\n                   ]\r\n               },\r\n               {\r\n                   \"name\": \"Subtask5.2\",\r\n                   \"worker\": {\r\n                       \"name\": \"Worker4\",\r\n                       \"company\": { \r\n                           \"name\": \"Company3\"\r\n                       }\r\n                   },\r\n                   \"subtasks\": [\r\n                       {\r\n                           \"name\": \"Subtask5.2.1\",\r\n                           \"worker\": {\r\n                               \"name\": \"Worker4\",\r\n                               \"company\": { \r\n                                   \"name\": \"Company3\"\r\n                               }\r\n                           }\r\n                       },\r\n                       {\r\n                           \"name\": \"Subtask5.2.2\",\r\n                           \"worker\": {\r\n                               \"name\": \"Worker4\",\r\n                               \"company\": { \r\n                                   \"name\": \"Company3\"\r\n                               }\r\n                           }\r\n                       }\r\n                   ]\r\n               }\r\n           ]\r\n       }\r\n   ]\r\n}\r\n<\/code><\/pre>\n<p>Speichern Sie dieses Dokument einfach in einer Datei und POSTen Sie es an den REST-Endpunkt <code>\/projects<\/code>:<\/p>\n<pre><code>$ curl -i -HX-User:admin -HX-Password:admin \"http:\/\/0.0.0.0:8082\/structr\/rest\/projects\" -XPOST -d @\/tmp\/project.json\r\nHTTP\/1.1 100 Continue\r\n\r\nHTTP\/1.1 201 Created\r\nContent-Type: application\/json; charset=utf-8\r\nSet-Cookie: JSESSIONID=rxjhtzyxetnj1l8dx6vg8aejq;Path=\/\r\nExpires: Thu, 01 Jan 1970 00:00:00 GMT\r\nLocation: http:\/\/0.0.0.0:8082\/structr\/rest\/projects\/fafeada746ef432196ee2ccfc7e362fc\r\nVary: Accept-Encoding, User-Agent\r\nContent-Length: 121\r\nServer: Jetty(9.1.4.v20140401)\r\n\r\n{\r\n  \"result_count\": 1,\r\n  \"result\": [\r\n    \"fafeada746ef432196ee2ccfc7e362fc\"\r\n  ],\r\n  \"serialization_time\": \"0.000226953\"\r\n}\r\n\r\n<\/code><\/pre>\n<p>Es wurde ein komplettes Diagramm erstellt, ohne dass eine Redundanz entstand!<\/p>\n<pre><code>curl -i -HX-User:admin -HX-Password:admin \"http:\/\/0.0.0.0:8082\/structr\/rest\/projects\/fafeada746ef432196ee2ccfc7e362fc\/ui\"\r\nHTTP\/1.1 200 OK\r\nContent-Type: application\/json; charset=utf-8\r\nSet-Cookie: JSESSIONID=el6ri37v61wzeuoni7ilgrl0;Path=\/\r\nExpires: Thu, 01 Jan 1970 00:00:00 GMT\r\nVary: Accept-Encoding, User-Agent\r\nContent-Length: 1222\r\nServer: Jetty(9.1.4.v20140401)\r\n\r\n{\r\n   \"query_time\": \"0.001580893\",\r\n   \"result_count\": 1,\r\n   \"result\": {\r\n      \"id\": \"fafeada746ef432196ee2ccfc7e362fc\",\r\n      \"name\": \"Project1\",\r\n      \"owner\": {\r\n         \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"name\": \"admin\"\r\n      },\r\n      \"type\": \"Project\",\r\n      \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n      \"deleted\": false,\r\n      \"hidden\": false,\r\n      \"createdDate\": \"2014-12-15T17:47:13+0100\",\r\n      \"lastModifiedDate\": \"2014-12-15T17:47:13+0100\",\r\n      \"visibleToPublicUsers\": false,\r\n      \"visibleToAuthenticatedUsers\": false,\r\n      \"visibilityStartDate\": null,\r\n      \"visibilityEndDate\": null,\r\n      \"tasks\": [\r\n         {\r\n            \"id\": \"517c1a89e44f479eb0802b9045271b4c\",\r\n            \"name\": \"Task1\"\r\n         },\r\n         {\r\n            \"id\": \"dace6757bad94aa0a137420741406699\",\r\n            \"name\": \"Task2\"\r\n         },\r\n         {\r\n            \"id\": \"097729f47768469ebeaacd00ea8a442e\",\r\n            \"name\": \"Task3\"\r\n         },\r\n         {\r\n            \"id\": \"27bfdc1bb293458eab0d912811f610da\",\r\n            \"name\": \"Task4\"\r\n         },\r\n         {\r\n            \"id\": \"b762fd8f2fe24d149d4a220412c56f49\",\r\n            \"name\": \"Task5\"\r\n         }\r\n      ]\r\n   },\r\n   \"serialization_time\": \"0.000166250\"\r\n}\r\n<\/code><\/pre>\n<pre><code>curl -i -HX-User:admin -HX-Password:admin \"http:\/\/0.0.0.0:8082\/structr\/rest\/companies\/ui\"\r\nHTTP\/1.1 200 OK\r\nContent-Type: application\/json; charset=utf-8\r\nSet-Cookie: JSESSIONID=1mc9hmhm2umrm1h60h1vt56o7c;Path=\/\r\nExpires: Thu, 01 Jan 1970 00:00:00 GMT\r\nVary: Accept-Encoding, User-Agent\r\nContent-Length: 2668\r\nServer: Jetty(9.1.4.v20140401)\r\n\r\n{\r\n   \"query_time\": \"0.002427711\",\r\n   \"result_count\": 3,\r\n   \"result\": [\r\n      {\r\n         \"id\": \"bc9de3a97bce409da5234e5976355aa9\",\r\n         \"name\": \"Company1\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Company\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"workers\": [\r\n            {\r\n               \"id\": \"2da31b7175cb44c787ff93fe43c7e317\",\r\n               \"name\": \"Worker1\"\r\n            },\r\n            {\r\n               \"id\": \"d980f56aacea4a0bb2cb8cf7b3a740d5\",\r\n               \"name\": \"Worker2\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"8fac823ef76f436c96cfc9e0c4c21fb5\",\r\n         \"name\": \"Company2\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Company\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"workers\": [\r\n            {\r\n               \"id\": \"a9a23f57b9ce4e33bcc1efbfd2537164\",\r\n               \"name\": \"Worker3\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"eb34f6449d69484f93c69320fe95ea24\",\r\n         \"name\": \"Company3\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Company\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"workers\": [\r\n            {\r\n               \"id\": \"eadcb538f90a41838f0196fd74b82037\",\r\n               \"name\": \"Worker4\"\r\n            },\r\n            {\r\n               \"id\": \"8f8bd3613aa543ecae222da22cdd2e14\",\r\n               \"name\": \"Worker5\"\r\n            }\r\n         ]\r\n      }\r\n   ],\r\n   \"serialization_time\": \"0.000221961\"\r\n}\r\n<\/code><\/pre>\n<pre><code>curl -i -HX-User:admin -HX-Password:admin \"http:\/\/0.0.0.0:8082\/structr\/rest\/workers\/ui\"\r\nHTTP\/1.1 200 OK\r\nContent-Type: application\/json; charset=utf-8\r\nSet-Cookie: JSESSIONID=1b6g61a7uo1t016croq1fz2x41;Path=\/\r\nExpires: Thu, 01 Jan 1970 00:00:00 GMT\r\nVary: Accept-Encoding, User-Agent\r\nContent-Length: 6253\r\nServer: Jetty(9.1.4.v20140401)\r\n\r\n{\r\n   \"query_time\": \"0.002056031\",\r\n   \"result_count\": 5,\r\n   \"result\": [\r\n      {\r\n         \"id\": \"2da31b7175cb44c787ff93fe43c7e317\",\r\n         \"name\": \"Worker1\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Worker\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"company\": {\r\n            \"id\": \"bc9de3a97bce409da5234e5976355aa9\",\r\n            \"name\": \"Company1\"\r\n         },\r\n         \"tasks\": [\r\n            {\r\n               \"id\": \"9988348105e34b1ab5d365f4e4f7262a\",\r\n               \"name\": \"Subtask1.1\"\r\n            },\r\n            {\r\n               \"id\": \"517c1a89e44f479eb0802b9045271b4c\",\r\n               \"name\": \"Task1\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"d980f56aacea4a0bb2cb8cf7b3a740d5\",\r\n         \"name\": \"Worker2\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Worker\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"company\": {\r\n            \"id\": \"bc9de3a97bce409da5234e5976355aa9\",\r\n            \"name\": \"Company1\"\r\n         },\r\n         \"tasks\": [\r\n            {\r\n               \"id\": \"196189bde51a43afb587563fb47fda91\",\r\n               \"name\": \"Subtask1.2\"\r\n            },\r\n            {\r\n               \"id\": \"bd35947338924daa85b13391083551b1\",\r\n               \"name\": \"Subtask1.3\"\r\n            },\r\n            {\r\n               \"id\": \"dace6757bad94aa0a137420741406699\",\r\n               \"name\": \"Task2\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"a9a23f57b9ce4e33bcc1efbfd2537164\",\r\n         \"name\": \"Worker3\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Worker\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:12+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"company\": {\r\n            \"id\": \"8fac823ef76f436c96cfc9e0c4c21fb5\",\r\n            \"name\": \"Company2\"\r\n         },\r\n         \"tasks\": [\r\n            {\r\n               \"id\": \"779b76705c9b43d598ce971024743b13\",\r\n               \"name\": \"Subtask1.4\"\r\n            },\r\n            {\r\n               \"id\": \"097729f47768469ebeaacd00ea8a442e\",\r\n               \"name\": \"Task3\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"eadcb538f90a41838f0196fd74b82037\",\r\n         \"name\": \"Worker4\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Worker\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"company\": {\r\n            \"id\": \"eb34f6449d69484f93c69320fe95ea24\",\r\n            \"name\": \"Company3\"\r\n         },\r\n         \"tasks\": [\r\n            {\r\n               \"id\": \"8b2dbfcc93b94e428052ff1276991e34\",\r\n               \"name\": \"Subtask4.1\"\r\n            },\r\n            {\r\n               \"id\": \"f4b99c128cc24c518e6f9af5c3affea4\",\r\n               \"name\": \"Subtask4.2\"\r\n            },\r\n            {\r\n               \"id\": \"e6156b8b566e45349e671229ff70f9ea\",\r\n               \"name\": \"Subtask4.3\"\r\n            },\r\n            {\r\n               \"id\": \"27bfdc1bb293458eab0d912811f610da\",\r\n               \"name\": \"Task4\"\r\n            },\r\n            {\r\n               \"id\": \"5e45f0d22ee944ec84bc31aa75b40dda\",\r\n               \"name\": \"Subtask5.1.1\"\r\n            },\r\n            {\r\n               \"id\": \"2e21cad09d09423dacec07abcc763c3f\",\r\n               \"name\": \"Subtask5.1.2\"\r\n            },\r\n            {\r\n               \"id\": \"ad2e56c80ea944808b7082cdcab9f659\",\r\n               \"name\": \"Subtask5.1\"\r\n            },\r\n            {\r\n               \"id\": \"6173bc32066b40498147630d92c17990\",\r\n               \"name\": \"Subtask5.2.1\"\r\n            },\r\n            {\r\n               \"id\": \"83889c6a55f043c6bd69dc04614ff76f\",\r\n               \"name\": \"Subtask5.2.2\"\r\n            },\r\n            {\r\n               \"id\": \"e04e9f77fa444c40904b474f27bcdc61\",\r\n               \"name\": \"Subtask5.2\"\r\n            }\r\n         ]\r\n      },\r\n      {\r\n         \"id\": \"8f8bd3613aa543ecae222da22cdd2e14\",\r\n         \"name\": \"Worker5\",\r\n         \"owner\": {\r\n            \"id\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n            \"name\": \"admin\"\r\n         },\r\n         \"type\": \"Worker\",\r\n         \"createdBy\": \"f02e59a47dc9492da3e6cb7fb6b3ac25\",\r\n         \"deleted\": false,\r\n         \"hidden\": false,\r\n         \"createdDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"lastModifiedDate\": \"2014-12-15T17:47:13+0100\",\r\n         \"visibleToPublicUsers\": false,\r\n         \"visibleToAuthenticatedUsers\": false,\r\n         \"visibilityStartDate\": null,\r\n         \"visibilityEndDate\": null,\r\n         \"company\": {\r\n            \"id\": \"eb34f6449d69484f93c69320fe95ea24\",\r\n            \"name\": \"Company3\"\r\n         },\r\n         \"tasks\": [\r\n            {\r\n               \"id\": \"7785c5445d2147578bc8831797241e53\",\r\n               \"name\": \"Subtask4.4\"\r\n            },\r\n            {\r\n               \"id\": \"b762fd8f2fe24d149d4a220412c56f49\",\r\n               \"name\": \"Task5\"\r\n            }\r\n         ]\r\n      }\r\n   ],\r\n   \"serialization_time\": \"0.000484448\"\r\n}\r\n<\/code><\/pre>\n<p>Ist das nicht faszinierend? \ud83d\ude42 <\/p>\n<h3 id=\"wie-es-funktioniert\">Wie es funktioniert<\/h3>\n<h4 id=\"arbeitsablauf\">Arbeitsablauf<\/h4>\n<p>Der Parser (GSON) erzeugt aus dem JSON eine verschachtelte Struktur von Maps (JsonInput), die rekursiv mit den Schemaregeln abgeglichen werden, beginnend mit dem innersten Objekt. Structr verwendet eine so genannte &#8222;DeserializationStrategy&#8220;, um herauszufinden, ob ein verschachteltes Objekt bereits im Graphen existiert (und daher direkt verlinkt werden kann), oder ob es gem\u00e4\u00df den Autocreation-Regeln im Schema erstellt werden sollte. <\/p>\n<h4 id=\"rekursive-auswertung\">Rekursive Auswertung<\/h4>\n<p>Beim Parsen des obigen JSON-Dokuments sucht Structr nach einem Projekt mit dem Namen &#8222;Project1&#8220; und einem Array von Aufgaben mit den Namen &#8222;Task1&#8220; bis &#8222;Task5&#8220;. Um den ersten Task mit dem Namen `Task1` zu finden, ruft Structr rekursiv die DeserializationStrategy auf, um den gew\u00fcnschten Task zu erhalten, und wiederholt dies f\u00fcr den Worker und das Unternehmen des Workers. Da die Entit\u00e4t &#8222;Firma&#8220; keine weiteren verschachtelten Elemente hat, wird die Rekursion beendet und Structr sucht in der Datenbank nach einer Firma mit dem Namen &#8222;Firma1&#8220;. Da die Firma nicht existiert, wird sie aufgrund der Einstellungen f\u00fcr die automatische Erstellung angelegt und zur vorherigen Rekursionsebene zur\u00fcckgef\u00fchrt, wo sie mit dem neu erstellten Arbeiter mit dem Namen &#8222;Arbeiter1&#8220; verkn\u00fcpft wird.   <\/p>\n<p>Dieser Prozess erstellt rekursiv neue Entit\u00e4ten oder holt sie aus der Datenbank, wenn sie bereits existieren, und bildet das verschachtelte JSON-Dokument gem\u00e4\u00df den Schemaregeln auf eine Graphstruktur ab.<\/p>\n<h3 id=\"structr-als-dokumentendatenbank\">Structr als Dokumentendatenbank<\/h3>\n<p>Das beschriebene Feature wird die Dokumentendatenbank-F\u00e4higkeiten von Structr erheblich erweitern und Teil der kommenden Version 1.1 sein.<\/p>\n<p>Den Testcode f\u00fcr dieses spezielle Beispiel finden Sie unter dem folgenden Link:<\/p>\n<p><a href=\"https:\/\/github.com\/structr\/structr\/blob\/master\/structr-rest\/src\/test\/java\/org\/structr\/rest\/document\/DocumentTest.java\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/structr\/structr\/blob\/master\/structr-rest\/src\/test\/java\/org\/structr\/rest\/document\/DocumentTest.java<\/a><br \/>\n&lt;\/Verk\u00fcrzung der Einsatzzeiten um bis zu 95 %;p&gt;[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row][vc_column][vc_column_text]Vor kurzem haben wir einige Tests mit der aktuellen Structr-Version durchgef\u00fchrt, um zu sehen, wie gut Structr mit tief verschachtelten \u2026<\/p>\n","protected":false},"author":2,"featured_media":2859,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[521,522,519,520],"tags":[533,534,535,542,524,540,539,525,530,537,531,528,529,541,526,532,538,523,536,527],"class_list":["post-2858","post","type-post","status-publish","format-standard","hentry","category-beispiel","category-dokument-datenbank","category-neo4j-de","category-rest-de","tag-aufgabenverwaltung","tag-beziehungen-zum-unternehmen","tag-deserializationstrategy-de","tag-dokument-datenbank","tag-graphische-datenbank","tag-gson-parser-de","tag-json-zu-graph-konvertierung","tag-neo4j-integration-de","tag-objekt-mapping","tag-projektleitung","tag-regeln-fur-die-automatische-erstellung","tag-rekursive-auswertung","tag-schema-regeln","tag-structr-1-1-freigabe","tag-structr-json-parsing-de","tag-structr-dokumenten-datenbank","tag-strukturelle-leistung","tag-strukturelle-merkmale","tag-struktureller-arbeitsablauf","tag-verschachtelte-json-dokumente"],"acf":[],"_links":{"self":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts\/2858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/comments?post=2858"}],"version-history":[{"count":7,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts\/2858\/revisions"}],"predecessor-version":[{"id":2877,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/posts\/2858\/revisions\/2877"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/media\/2859"}],"wp:attachment":[{"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/media?parent=2858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/categories?post=2858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/structr.com\/de\/wp-json\/wp\/v2\/tags?post=2858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}