Zum Hauptinhalt springen

Metadata SQL Views

Zur Abfrage von Metadaten wird eine Integrationsschicht auf Datenbankebene in Form von SQL Views (PostgreSQL) angeboten.

Hinweis

In den nachfolgenden Beispielen wird zur Veranschaulichung der Server https://www.myserver.com verwendet (z.B. im Pfad https://www.myserver.com/web/admin) und muss in echten Aufrufen entsprechend ersetzt werden. Je nach Konfiguration muss die URL gegebenenfalls noch um den Context-Path erweitert werden (z.B. https://www.myserver.com/dataspot/web/admin).

Das physische Design des Datenmodells von dataspot ist stark geprägt von folgenden Anforderungen:

  • Persistierung von Metadatenobjekten in einer objektorientierten Vererbungshierarchie
  • Beziehungen zwischen Metadatenobjekten auf unterschiedlichen Ebenen in der Objekt-Hierarchie
  • Vollständige Versionierung der Metadatenobjekte (einschließlich Public und Draft Versionen)
  • Mehrsprachigkeit der Inhalte
  • Mehrmandantenfähigkeit

Die Metadata SQL Views bieten die Möglichkeit, Metadatenobjekte abzufragen oder zu exportieren, um sie gegebenenfalls in anderen Tools (z.B. mittels BI-Software) weiterzuverarbeiten bzw. auszuwerten. Die Metadata SQL Views sind jedoch nicht geeignet, um Änderungen an den Metadatenobjekten durchzuführen. Für diesen Zweck kann das Metadata REST/API verwendet werden.

Überblick

Die Views können in folgende drei Kategorien eingeteilt werden:

  1. Asset Views (z.B. attribute)
  2. Link Views (z.B. derivedfrom)
  3. Sonstige Views (z.B. customproperties, timeseries)

Jede dieser Views gibt es in drei Ausprägungen:

  1. Latest View (z.B. attribute_view)
  2. Public View (z.B. attribute_public_view)
  3. Version View (z.B. attribute_version_view)

Die Menge an Ergebnissen, welche diese Views liefern, kann durch folgende Session-Variablen in PostgreSQL beeinflusst werden:

Session-VariableBeschreibung
dataspot.languageDer ISO Code der Sprache
Default: Nur die Ergebnisse in der Default-Sprache werden zurückgeliefert
dataspot.tenantsEine Liste von UUIDs der Mandanten, nach denen die Ergebnisse gefiltert werden sollen
Default: Alle Mandanten
dataspot.versionDer Zeitpunkt, zu dem Metadaten abgefragt werden sollen (nur relevant für Version View)
Default: Aktueller Zeitpunkt
Hinweis

Die Views sind vollständig dokumentiert. Bei Verwendung eines geeigneten SQL-Abfrage-Tools können sowohl die Beschreibungen der Views als auch die Beschreibungen ihrer Spalten angezeigt werden.

Metamodell

Die SQL-Abfragen richten sich nach dem Metamodell. Das Metamodell dokumentiert alle Eigenschaften und Beziehungen der Metadatenobjekte und bildet die Grundlage für alle Metadata SQL Views. Das Metamodell ist in der Datenbank meta unter folgender URL erreichbar:

https://www.myserver.com/web/meta
Hinweis

Die Datenbank meta kann in der Admin-Konsole (https://www.myserver.com/web/admin) erzeugt werden.

Beispiele

Am besten kann die Verwendung der Metadata SQL Views anhand von Beispielen verdeutlicht werden. Deshalb werden im Folgenden exemplarisch für typische Anwendungsfälle SQL-Statements angeführt, mithilfe derer Metadaten abgefragt bzw. ausgewertet werden können.

Die Beispiele gehen davon aus, dass search_path in PostgreSQL auf das Schema dataspot wie folgt gesetzt wurde:

SET search_path TO dataspot;

Alternativ kann der Name der View mit dem Präfix dataspot. explizit ausqualifiziert werden.

SQL-Statements

-- Anzahl Geschäftsobjekte

SELECT COUNT(*)
FROM classifier_view
WHERE _type = 'BusinessObject';
-- Veröffentlichte Attribute

SELECT classifier.label, attribute.label
FROM attribute_public_view attribute
JOIN classifier_public_view classifier
ON classifier.id = attribute.has_domain;
-- Attribute, die Bestandteile von Datasets sind

SELECT dataset.label, asset.label
FROM asset_view asset
JOIN composedof_view composedof
ON composedof.composed_of = asset.id
JOIN dataset_view dataset
ON composedof.resource_id = dataset.id
WHERE asset._type = 'BusinessAttribute';
-- Attribute in einem bestimmten Modell

SELECT attribute.label
FROM attribute_view attribute
JOIN scheme_view scheme
ON scheme.id = attribute.model_id
WHERE scheme.label = 'Fachdatenmodell';
-- Assets mit einer bestimmten benutzerspezifischen Eigenschaft

SELECT asset._type, asset.label
FROM asset_view asset
JOIN customproperties_view customproperties
ON customproperties.resource_id = asset.id
AND customproperties.name = 'securityClass'
AND customproperties.value = '"SK0"';
-- Volltext-Suche nach Assets

SELECT asset._type, asset.label, asset.title, asset.description
FROM asset_view asset
JOIN fulltext_view fulltext
ON fulltext.resource_id = asset.id
JOIN TO_TSQUERY('Person') query
ON fulltext.tokens @@ query;
-- Zeitreihen für Referenzwerte von Referenzobjekten

SELECT timeseries.valid_from, timeseries.valid_to, timeseries.code, timeseries.short_text, timeseries.long_text
FROM timeseries_view timeseries
JOIN enumeration_view enumeration
ON enumeration.label = 'Land'
JOIN literal_view literal
ON literal.literal_of = enumeration.id
AND literal.id = timeseries.resource_id;
-- Assets (inkl. untergeordnete), für die eine Person eine Rolle hat

WITH RECURSIVE results AS (
SELECT asset.id, asset._type, asset.model_id, asset.label
FROM asset_view asset
JOIN attributedto_view attributedto
ON attributedto.resource_id = asset.id
JOIN post_view post
ON post.id = attributedto.attributed_to
JOIN role_view role
ON role.id = post.has_role
AND role.label = 'Data Steward'
JOIN holdspost_view holdspost
ON holdspost.holds_post = post.id
JOIN person_view person
ON person.family_name = 'Kainz'
AND person.given_name = 'Barbara'
AND holdspost.resource_id = person.id
UNION SELECT asset.id, asset._type, asset.model_id, asset.label
FROM asset_view asset
JOIN results
ON results.id = asset.parent_id)
SELECT scheme.label, results._type, results.label
FROM results
JOIN scheme_view scheme
ON scheme.id = results.model_id;
-- Alle Geschäftsobjekte samt der Personen (einschließlich ihrer Rolle),
-- die für das Geschäftsobjekt (oder für ein übergeordnetes Asset) verantwortlich sind

WITH recursive parent (id, parent_id, resource_id) AS (
SELECT id, parent_id, id
FROM dataspot.asset_view
UNION
SELECT parent.id, asset.parent_id, asset.id
FROM dataspot.asset_view asset
JOIN parent
ON parent.parent_id = asset.id)
SELECT asset.id, dataspot.asset_to_natural_key(asset.id) AS asset_label,
attribution.attributed_as, dataspot.asset_to_natural_key(attribution.attributed_as) AS attributed_as_label,
attribution.attributed_to, dataspot.asset_to_natural_key(attribution.attributed_to) AS attributed_to_label,
attribution.agent_id, dataspot.asset_to_natural_key(attribution.agent_id) as person_label
FROM dataspot.asset_view asset
JOIN parent
ON parent.id = asset.id
JOIN dataspot.attributedagent_view attribution
ON attribution.resource_id = parent.resource_id
AND EXISTS (SELECT FROM dataspot.person_view person WHERE person.id = attribution.agent_id)
WHERE asset._type = 'BusinessObject'
ORDER by asset_label, attributed_as_label, attributed_to_label, person_label;
-- Attribute zu einem bestimmten Zeitpunkt (d.h. Version)

SET dataspot.version = '2021-11-11T11:11:11';

SELECT classifier.label, attribute.label
FROM attribute_version_view attribute
JOIN classifier_version_view classifier
ON classifier.id = attribute.has_domain;
-- Liste aller Mandanten

SELECT id, tenant_name FROM tenant;
-- Attribute eines oder mehrerer Mandanten

SET dataspot.tenants = '{"e7a30eac-5b94-4567-a0c7-f99d0d712884", "a782c41a-4aeb-49ea-905e-27c517621457"}';

SELECT classifier.label, attribute.label
FROM attribute_view attribute
JOIN classifier_view classifier
ON classifier.id = attribute.has_domain;