linked-swissbib / hydra-swissbib.ch

MIT License
4 stars 2 forks source link

Modellierung der Property vcard:hasAdress als Objekt in api-platform #3

Open guenterh opened 6 years ago

guenterh commented 6 years ago

Wie kann man in einer api-platform Entity eine komplette Entity (Json-Objeckt) als Objekt eines Triples definieren.

Beispiel: property vcard:hasAdress in http://sb-ues1.swissbib.unibas.ch:8080/lsb/organisation/IDSBB-B513

(s. auch screenshot für Zugriff ausserhalb der Uni vcard_hasaddress_property

Hinweis: der Kontext ist noch nicht richtig definiert https://resources.swissbib.ch/organisation/context.jsonld

maechler commented 6 years ago

Hallo Günter

API-Platform beschreibt hier diesen Use Case kurz: https://api-platform.com/docs/core/serialization-groups-and-relations#embedding-relations Allerdings ist dort nur beschrieben wie es funktioniert wenn man eine Datenbank und Doctrine ORM benutzt. Für die Generierung des korrekten Kontexts reicht es evtl. bereits die Annotation normalization_context hinzuzufügen, wie in der Dokumentation beschrieben. Für die Generierung der eigentlichen Antwort müssen sicherlich Erweiterungen gemacht werden, da von uns bis jetzt nur flache Objekte unterstützt sind.

Ich würde so vorgehen:

  1. Sicher mal ein eigenes Objekt "Address" erstellen mit den entsprechenden Eigenschaften.

  2. Ausprobieren ob der Context bereits erweitert wird wenn normalization_context entsprechend gesetzt ist. (Ich frage mich da allerdings wie die Relation zum Address Objekt hergestellt wird ohne eine Mapping-Definition wie es für Doctrine nötig wäre)

  3. Erweitern des ContextMappers für rekursive Kontexte: https://github.com/linked-swissbib/hydra-swissbib.ch/blob/master/src/LinkedSwissbibBundle/Elasticsearch/ContextMapper.php Der ContextMapper ist nötig, da im Index alle Felder mit einem Namespace-Präfix versehen sind (z.B. dct:title). Dies wird aber von API-Platform nicht unterstützt. Ich habe dazu mal ein Issue erfasst , konnte aber erst Teile davon implementieren: https://github.com/api-platform/core/issues/767

  4. Erweiterung des EntityBuilders für rekursive Strukturen: https://github.com/linked-swissbib/hydra-swissbib.ch/blob/master/src/LinkedSwissbibBundle/Entity/SimpleEntityBuilder.php

Als Ausgangspunkt würde ich immer vom ElasticSearchDataProvider ausgehen. Dort werden die Abfragen gemacht und die Transformation in Objekte gesteuert: https://github.com/linked-swissbib/hydra-swissbib.ch/blob/master/src/LinkedSwissbibBundle/DataProvider/ElasticsearchDataProvider.php