Raumdokumente Beispiel

From ProWiki - Demo and Test Wiki

This is the latest revision of this page; it has no approved revision.

Dieses Beispiel zeigt, wie man auf einer Raumseite alle Dokumente auflistet, die entweder direkt für diesen Raum oder für eine seiner Raumgruppen gelten.

Datenmodell

Seitenart Annotation Beispiel
Raum Hat Raumgruppe (Datentyp Seite, mehrwertig) Raum 102
Raumgruppe keine Raumgruppe Labore
Dokument Gilt für (Datentyp Seite, mehrwertig, Räume und Raumgruppen gemischt) Prüfprotokoll Messgeräte

Dokumente zeigen also auf Räume oder auf Raumgruppen. Es gibt bewusst keine zweite, "ausmultiplizierte" Eigenschaft.

Die Abfrage

Auf der Raumseite steht in SQL-Denke:

<gilt für mich> OR <gilt für eine meiner Raumgruppen>

Das lässt sich in SMW direkt hinschreiben. Die Abfrage steckt in Template:Raum:

{{#ask:
 [[Category:Dokument]] [[Gilt für::{{FULLPAGENAME}}]]
 OR
 [[Category:Dokument]] [[Gilt für.-Hat Raumgruppe::{{FULLPAGENAME}}]]
 |?Gilt für = Gültig für
 |mainlabel = Dokument
 |format = table
 |default = Für diesen Raum sind keine Dokumente hinterlegt.
}}
Zweig 1
Dokument → Gilt für → dieser Raum.
Zweig 2
Dokument → Gilt für → eine Seite G, und G → -Hat Raumgruppe → dieser Raum.
-Hat Raumgruppe ist die inverse Eigenschaft und läuft von der Raumgruppe zurück zu ihren Räumen. Der Punkt in Gilt für.-Hat Raumgruppe ist die SMW-Kettenschreibweise.

Da OR die Ergebnismengen vereinigt, wird ein Dokument, das direkt und über eine Raumgruppe gilt, nur einmal aufgeführt.

Ergebnisse, live abgefragt

Alles ab hier sind echte #ask-Abfragen gegen die Beispieldaten. Nichts davon ist abgetippt. Wer eine Zuordnung ändert oder ein Dokument anlegt, sieht das Ergebnis hier direkt.

Der OR-Nachweis an Raum 101

Die beiden Zweige laufen zuerst einzeln und dann gemeinsam. Damit ist belegt, dass OR die Ergebnismengen vereinigt und dabei Dubletten entfernt.

Abfragebedingung Ergebnis
nur direkt zugeordnet
[[Gilt für::Raum 101]]
nur über die Raumgruppe geerbt
[[Gilt für.-Hat Raumgruppe::Raum 101]]
beide Zweige mit OR
genau so steht es in Template:Raum

Zwei plus zwei ergibt hier drei: Prüfprotokoll Messgeräte gilt direkt und über die Raumgruppe und wird trotzdem nur einmal aufgeführt. Zwei getrennte Abfragen würden es doppelt zeigen.

Alle Räume

Raum Raumgruppen (Abfrage) Dokumente (OR-Abfrage) demonstriert
Raum 101 Raumgruppe Labore direkt, geerbt und die Dublette
Raum 102 Raumgruppe Labore, Raumgruppe Werkstatt erbt aus zwei Raumgruppen
Raum 103 keine ohne Raumgruppe, nur direkt
Raum 104 keine keine leeres Ergebnis

In Template:Raum steht dieselbe Abfrage mit {{FULLPAGENAME}} statt des festen Raumnamens. Deshalb läuft sie auf jeder Raumseite von selbst, siehe Raum 101.

Umgekehrte Richtung

Von der Raumgruppe aus, ganz ohne Inverse, weil die Annotation dort schon in der passenden Richtung steht.

Raumgruppe Räume (Abfrage) Dokumente der Gruppe (Abfrage)
Raumgruppe Labore
Raumgruppe Werkstatt

Beispieldaten

Raumgruppen

Dokumente

DokumentGilt für
Betriebsanweisung WerkstattRaumgruppe Werkstatt
Hausordnung Raum 103Raum 103
Notfallplan Raum 101Raum 101
Prüfprotokoll MessgeräteRaumgruppe Labore
Raum 101
Sicherheitshinweis LaboreRaumgruppe Labore

Hinweise

  • Wichtigster Fallstrick: Hat Raumgruppe und Gilt für müssen Datentyp Seite haben ([[Has type::Page]]). Bei Datentyp Text scheitert die inverse Eigenschaft nicht mit einer Fehlermeldung, sondern liefert stillschweigend ein falsches Ergebnis. In diesem Wiki getestet gegen die Text-Eigenschaft Fachrichtungen: [[-Fachrichtungen::Berufsoberschule]] liefert nicht etwa nichts, sondern schlicht alle Seiten des Wikis. Also vor dem Einsatz auf beiden Eigenschaftsseiten den Datentyp prüfen.
  • Gesetzt werden die Werte mit #set, nicht als Annotation im Fließtext ([[Gilt für::Wert]]). Anzeige und Daten bleiben dadurch getrennt, und der Text lässt sich umformulieren, ohne die Annotation zu zerstören. In Abfragebedingungen bleibt [[Gilt für::Wert]] dagegen richtig, das ist dort keine Annotation, sondern Abfragesyntax.
  • Inverse Eigenschaften funktionieren nur in #ask, nicht in #show.
  • Bei OR müssen gemeinsame Bedingungen in beiden Zweigen wiederholt werden, hier Category:Dokument.
  • Verschachtelte Raumgruppen löst SMW nicht transitiv auf. Jede weitere Ebene braucht einen eigenen OR-Zweig mit einem zusätzlichen Kettenglied: [[Gilt für.-Hat Raumgruppe.-Hat Raumgruppe::{{FULLPAGENAME}}]]
  • Aktualität: Das Ergebnis einer eingebetteten #ask-Abfrage steckt im Parser-Cache der Raumseite. Ein neu angelegtes Dokument erscheint dort erst, wenn die Raumseite neu geparst wird. Dieses Beispiel zeigte nach dem Anlegen zunächst auf allen Raumseiten "keine Dokumente", weil die Raumseiten vor den Dokumentseiten gespeichert wurden. Nach einem Purge (action=purge&forcelinkupdate=1 bzw. Aktualisieren im Seitenmenü) stimmte die Liste sofort. Im laufenden Betrieb erledigt das die Abhängigkeitsverfolgung von SMW ($smwgQueryDependencyLinksStoreEnabled, standardmäßig aktiv) über die Job-Queue. Läuft die Job-Queue nicht zuverlässig, hinken die Listen hinterher.
  • Dokumente ohne Geltungsbereich finden: {{#ask: [[Category:Dokument]] [[Gilt für::!+]] }}