{"id":506,"date":"2021-05-23T17:26:40","date_gmt":"2021-05-23T16:26:40","guid":{"rendered":"https:\/\/www.csopro.de\/biblog\/?p=506"},"modified":"2021-05-23T17:26:40","modified_gmt":"2021-05-23T16:26:40","slug":"zugriff-auf-cds-von-azure-data-factory-umgang-mit-spalten-mit-vielen-null-werten","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2021\/05\/zugriff-auf-cds-von-azure-data-factory-umgang-mit-spalten-mit-vielen-null-werten\/","title":{"rendered":"Zugriff auf CDS von Azure Data Factory: Umgang mit Spalten mit vielen NULL-Werten"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Fehlersituation<\/h2>\n\n\n\n<p>In meinem aktuellen Projekt lesen wir aus Dynamics CRM 365 Daten in unser Data Warehouse, das wir unter Azure gebaut haben. Wir hatten dabei ein Problem: In einigen Tabellen gibt es Spalten, die in vielen Zeilen nicht gef\u00fcllt sind. Wir hatten identische Testdatens\u00e4tze, die an zwei unterschiedlichen Tagen nach CRM importiert wurden (durch ein anderes Team). Beim Laden der Daten fiel uns auf, dass an einem Tag eine Spalte leer blieb, obwohl sie am Abzug am Tag zuvor manchmal Werte enthalten hatte &#8211; und sich in der Quelle nichts ge\u00e4ndert hatte.<\/p>\n\n\n\n<p>Das Ergebnis unserer Suche und die Fehlerbehebung m\u00f6chte ich hier kurz beschreiben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einstieg<\/h2>\n\n\n\n<p>Als Einstieg empfehlen sich diese beiden Seiten: <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/de-de\/azure\/data-factory\/connector-dynamics-crm-office-365\" data-type=\"URL\" data-id=\"https:\/\/docs.microsoft.com\/de-de\/azure\/data-factory\/connector-dynamics-crm-office-365\" target=\"_blank\">Microsoft-Dokumentation<\/a> und dieser <a rel=\"noreferrer noopener\" href=\"https:\/\/www.sqlservercentral.com\/blogs\/extracting-data-from-common-data-services-microsoft-dynamics-365-using-azure-data-factory\" data-type=\"URL\" data-id=\"https:\/\/www.sqlservercentral.com\/blogs\/extracting-data-from-common-data-services-microsoft-dynamics-365-using-azure-data-factory\" target=\"_blank\">SQL Server Central-Artikel<\/a>. Aber es gibt nat\u00fcrlich noch etliche Artikel im Netz.<\/p>\n\n\n\n<p>Interessanter Weise enth\u00e4lt der Microsoft-Artikel folgende Stelle &#8211; markiert als wichtig (ca. in der Mitte des Artikels):<\/p>\n\n\n\n<ul class=\"has-background wp-block-list\" style=\"background-color:#daf2f4\"><li>Wenn Sie Daten aus Dynamics kopieren, ist die explizite Spaltenzuordnung aus Dynamics zur Senke optional. Es wird jedoch dringend zu der Zuordnung geraten, um ein deterministisches Kopierergebnis sicherzustellen. <\/li><li>Wenn ein Schema in Data Factory in der Erstellungsbenutzeroberfl\u00e4che importiert wird, wird auf das Schema r\u00fcckgeschlossen. Dies erfolgt, in dem die obersten Zeilen aus dem Ergebnis der Dynamics-Abfrage gesamplet werden, um die Liste der Quellspalten zu initialisieren. In diesem Fall werden Spalten ohne Werte in den obersten Reihen ausgelassen. Dasselbe Verhalten gilt f\u00fcr Kopiervorg\u00e4nge, wenn keine explizite Zuordnung vorliegt. Sie k\u00f6nnen Spalten \u00fcberpr\u00fcfen und weitere zur Zuordnung hinzuf\u00fcgen. Diese Spalten werden auch w\u00e4hrend der Laufzeit des Kopiervorgangs ber\u00fccksichtigt.<\/li><\/ul>\n\n\n\n<p>Hier ist also genau unser <strong>Problem <\/strong>beschrieben: Wenn eine Zeile viele NULL-Werte enth\u00e4lt, kann es (nicht deterministisch) passieren, dass die Inhalte der Spalte nicht \u00fcbertragen wird, wenn kein Schema definiert ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Unser ursr\u00fcnglicher Code<\/h2>\n\n\n\n<p>Unsere Einstellungen der Copy-Aktivit\u00e4t sahen so aus:<\/p>\n\n\n\n<p>Zun\u00e4chste die <strong>Quelle<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"452\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle-1024x452.png\" alt=\"Einstellungen der Quelle\" class=\"wp-image-507\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle-1024x452.png 1024w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle-300x132.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle-768x339.png 768w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Quelle.png 1078w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Quelle der Copy-Aktivit\u00e4t<\/figcaption><\/figure>\n\n\n\n<p>Wie man sieht, verwenden wir ein Fetch-XML als Abfrage mit<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>einem Filter-Kriterium, da wir nur bestimmte Datens\u00e4tze ermitteln wollen. (Deswegen ist die Abfrage auch dynamisch)<\/li><li>genannten Attributnamen, da wir nicht alle Spalten \u00fcbertragen wollen<\/li><li>einem Join (link-entity) auf eine andere Entit\u00e4t, aus der wir auch einige Attribute entnehmen.<\/li><\/ul>\n\n\n\n<p>Die <strong>Senke <\/strong>sieht so aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Senke.png\"><img loading=\"lazy\" decoding=\"async\" width=\"996\" height=\"563\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Senke.png\" alt=\"Senke\" class=\"wp-image-509\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Senke.png 996w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Senke-300x170.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Senke-768x434.png 768w\" sizes=\"auto, (max-width: 996px) 100vw, 996px\" \/><\/a><figcaption>Senke der Copy-Aktivit\u00e4t<\/figcaption><\/figure>\n\n\n\n<p>Hier ist eigentlich nur zu beachten, dass wir keine Tabellen-Option gew\u00e4hlt haben, also die Tabelle nicht automatisch gem\u00e4\u00df des Schemas aus der Quelle erstellen lassen.<\/p>\n\n\n\n<p>Der <strong>Zuordnung<\/strong>s-Reiter sieht wie folgt aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"130\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung-1024x130.png\" alt=\"\" class=\"wp-image-510\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung-1024x130.png 1024w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung-300x38.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung-768x98.png 768w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/04\/Zuordnung.png 1344w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Zuordnung der Copy-Aktivit\u00e4t<\/figcaption><\/figure>\n\n\n\n<p>Also verwenden wir ein dynamisches Mapping.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung ist damit auch klar: Wir brauchen ein Schema in der Zuordnung. Es reicht aber nicht aus, das Schema zu importieren, weil beim Importieren des Schemas das gleiche passieren kann: Wenn eine Spalte NULL-Werte hat (im Sample) wird sie nicht als Quell-Spalte gesehen, z.B. hier (man sieht nur einen Ausschnitt):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"383\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema-1024x383.png\" alt=\"\" class=\"wp-image-514\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema-1024x383.png 1024w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema-300x112.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema-768x287.png 768w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/importiertesSchema.png 1492w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Zuordnung mit importierten Schemas<\/figcaption><\/figure>\n\n\n\n<p>Wir m\u00fcssen also ein dynamisches Schema in der Zuordnung angeben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/Zuordnung_dynamisch.png\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"153\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/Zuordnung_dynamisch.png\" alt=\"\" class=\"wp-image-515\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/Zuordnung_dynamisch.png 892w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/Zuordnung_dynamisch-300x51.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/Zuordnung_dynamisch-768x132.png 768w\" sizes=\"auto, (max-width: 892px) 100vw, 892px\" \/><\/a><figcaption>dynamische Zuordnung<\/figcaption><\/figure>\n\n\n\n<p>Wenn wir diese dynamische Zuordnung definiert haben, wobei wir f\u00fcr jede Spalte eine Definition hinterlegt haben, funktioniert es \ud83d\ude42<\/p>\n\n\n\n<p>Wie kommen wir nun zu der L\u00f6sung?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorgehen<\/h2>\n\n\n\n<p>Wir m\u00fcssen also ein Mapping definieren, das so aussieht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"type\": \"TabularTranslator\",\n  \"mappings\": [\n    {\n      \"source\": {\n        \"name\": \"statecode\",\n        \"type\": \"Int32\"\n      },\n      \"sink\": {\n        \"name\": \"statecode\",\n        \"type\": \"Int32\"\n      }\n    },\n    {\n      \"source\": {\n        \"name\": \"statuscode\",\n        \"type\": \"Int32\"\n      },\n      \"sink\": {\n        \"name\": \"statuscode\",\n        \"type\": \"Int32\"\n      }\n    }\n  ]\n}<\/pre>\n\n\n\n<p>In diesem Beispiel werden zwei Spalten gemappt (statecode und statuscode) &#8211; und die Spalten hei\u00dfen jeweils in der Quelle und im Ziel gleich.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Wie k\u00f6nnen wir nun ein solches JSON einfach erzeugen?<\/h4>\n\n\n\n<p>In unserem Falll war es so, dass wir alle Zieltabellen bereits angelegt hatten. Das kann man zum Beispiel dadurch erreichen, dass man als erstes die Tabelle als ganzes (also nicht mit Fetch-XML) kopiert &#8211; und in der Senke &#8222;Tabelle automatisch erstellen&#8220; anw\u00e4hlt.<\/p>\n\n\n\n<p>Dann sind wir so vorgegangen (was ich im Nachfolgenden genauer beschreiben werde):<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>In der Zuordnung Schema importieren<\/li><li>Im Code der Pipeline den entsprechenden Block (translator) kopieren<\/li><li>In einem JSON-Editor fehlende Mappings (es steht nur eine Sink aber keine Source drin) korrigieren<\/li><li>Zuordnung wieder l\u00f6schen<\/li><li>dynamischen Inhalt hinzuf\u00fcgen als @json(&lt;generiertes JSON>)<\/li><\/ol>\n\n\n\n<p>Nun die Punkte im Detail:<\/p>\n\n\n\n<p>1. In der Zuordnung Schema importieren<\/p>\n\n\n\n<p>Das ist klar.<\/p>\n\n\n\n<p>2. Im Code der Pipeline den entsprechenden Block (translator) kopieren<\/p>\n\n\n\n<p>\u00dcber das Symbol {} gelangt man zur Codeansicht der Pipeline:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"67\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen-1024x67.png\" alt=\"\" class=\"wp-image-516\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen-1024x67.png 1024w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen-300x20.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen-768x50.png 768w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/CodeAnzeigen.png 1209w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Codeansicht via {}<\/figcaption><\/figure>\n\n\n\n<p>Diesen Code kopiert man in einen JSON-Editor (z.B. Visual Studio). Dort sucht man nach &#8222;TabularTranslator&#8220;. Man findet dann eine Stelle, die ungef\u00e4hr so aussieht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">...\n\"translator\": {\n                  \"type\": \"TabularTranslator\",\n                  \"mappings\": [\n                    {\n                      \"source\": {\n                        \"name\": \"statecode\",\n                        \"type\": \"Int32\"\n                      },\n                      \"sink\": {\n                        \"name\": \"statecode\",\n                        \"type\": \"Int32\"\n                      }\n                    },\n                    {\n                      \"source\": {...<\/pre>\n\n\n\n<p>(Falls man in seinem Code mehrere Copy-Tasks hat, muss man nat\u00fcrlich aufpassen. Allerdings ist vor dem translator-Knoten der sink-Knoten und danach der inputs- und outputs-Knoten, so dass man genau sieht, an welcher Stelle man gerade ist)<\/p>\n\n\n\n<p>Wir entnehmen nun diesen Code &#8211; die geschweifte Klammer nach >>&#8220;translator&#8220; : &lt;&lt;<\/p>\n\n\n\n<p>3. In einem JSON-Editor fehlende Mappings (es steht nur eine Sink aber keine Source drin) korrigieren<\/p>\n\n\n\n<p>Wenn wir diesen Code genauer anschauen, sehen wir die source-sink-Paare. Allerdings sind dort, wo der automatische Schema-Import keine Treffer finden konnte (weil die Spalten in der Quelle wegen der NULL-Werte nicht drin waren), keine source-Knoten vorhanden.<\/p>\n\n\n\n<p>Aus<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2026\n{\n\"sink\": {\n\"name\": \"importsequencenumber\",\n\"type\": \"Int32\"\n}\n},\n\u2026<\/pre>\n\n\n\n<p><br>machen wir also folgendes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">...\n    {\n      \"source\": {\n        \"name\": \"importsequencenumber\",\n        \"type\": \"Int32\"\n      },\n      \"sink\": {\n        \"name\": \"importsequencenumber\",\n        \"type\": \"Int32\"\n      }\n    },\n...<\/pre>\n\n\n\n<p>Wir verwenden also den gleichen Namen und den gleichen Datentyp.<\/p>\n\n\n\n<p>4. Zuordnung wieder l\u00f6schen<\/p>\n\n\n\n<p>Dieser Schritt ist wieder einfach. Man muss auf den Papierkorb klicken.<\/p>\n\n\n\n<p>5. dynamischen Inhalt hinzuf\u00fcgen als @json()<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/DynamischenInhalthinzufuegen.png\"><img loading=\"lazy\" decoding=\"async\" width=\"878\" height=\"194\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/DynamischenInhalthinzufuegen.png\" alt=\"\" class=\"wp-image-518\" srcset=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/DynamischenInhalthinzufuegen.png 878w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/DynamischenInhalthinzufuegen-300x66.png 300w, https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2021\/05\/DynamischenInhalthinzufuegen-768x170.png 768w\" sizes=\"auto, (max-width: 878px) 100vw, 878px\" \/><\/a><figcaption>dynamischen Inhalt hinzuf\u00fcgen<\/figcaption><\/figure>\n\n\n\n<p>Der Link &#8222;Dynamischen Inhalt hinzuf\u00fcgen&#8220; erscheint, wenn man mit der Maus in die N\u00e4he kommt. Dort klickt man drauf und kann im Editor Code eingeben.<\/p>\n\n\n\n<p>Der Code sieht dann z.B. so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@json('{\n    \"type\": \"TabularTranslator\",\n    \"mappings\": [\n        {\n            \"source\": {\n                \"name\": \"statecode\",\n                \"type\": \"Int32\"\n            },\n            \"sink\": {\n                \"name\": \"statecode\",\n                \"type\": \"Int32\"\n            }\n        },\n        { ...<\/pre>\n\n\n\n<p>Man beachte, dass ich nach @json( ein einfaches Anf\u00fchrungszeichen und innerhalb des JSON doppelte Anf\u00fchrungszeichen verwendate habe.<\/p>\n\n\n\n<p>Eine Sache muss man hier noch beachten &#8211; es kann sein, dass der Code zu lang wird, so dass Azure Data Factory einen Fehler anzeigt. Wie man den behebt, beschreibe ich im n\u00e4chsten Blogeintrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fehlersituation In meinem aktuellen Projekt lesen wir aus Dynamics CRM 365 Daten in unser Data Warehouse, das wir unter Azure gebaut haben. Wir hatten dabei ein Problem: In einigen Tabellen gibt es Spalten, die in vielen Zeilen nicht gef\u00fcllt sind. Wir hatten identische Testdatens\u00e4tze, die an zwei unterschiedlichen Tagen nach CRM importiert wurden (durch ein &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2021\/05\/zugriff-auf-cds-von-azure-data-factory-umgang-mit-spalten-mit-vielen-null-werten\/\" class=\"more-link\"><span class=\"screen-reader-text\">Zugriff auf CDS von Azure Data Factory: Umgang mit Spalten mit vielen NULL-Werten<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64,73],"tags":[71,74,76,77,75],"class_list":["post-506","post","type-post","status-publish","format-standard","hentry","category-azure-data-factory","category-common-data-services","tag-adf","tag-cds","tag-copy","tag-dynamics-crm-365","tag-fetchxml"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=506"}],"version-history":[{"count":5,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/506\/revisions"}],"predecessor-version":[{"id":520,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/506\/revisions\/520"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}