Ich brauche ein Tag-basiertes Suchsystem von JCR wie Modeshape. Ich möchte Knoten nach einigen Tags suchen. Frage ist, was ist der beste Weg, um es zu implementieren?
Es gibt mehrere Möglichkeiten, Tags in JCR zu implementieren. Welche Option Sie auswählen, hängt von den Anforderungen Ihrer eigenen Anwendung (en) ab. Hier sind vier Optionen, die ich kenne.
Option 1: Verwenden Sie Mixins
Definieren Sie für jedes Tag eine Mixin-Knotentypdefinition, die ein Marker-Mixin ist (es hat keine Eigenschaftsdefinitionen oder Kindknotendefinitionen) und registriert sie dynamisch mit dem NodeTypeManager. Wenn Sie dann einen Knoten "markieren" möchten, fügen Sie einfach den Mixin, der das Tag darstellt, zu diesem Knoten hinzu. Jeder Knoten könnte mehrere Tags haben, und Sie könnten nach allen Knoten fragen, die ein bestimmtes Tag haben.
(Im Rest dieser Antwort wird "acme" als generischer Namespace verwendet. Sie sollten diesen durch einen Namespace ersetzen, der für Ihre eigene Anwendung und Organisation geeignet ist.)
Zum Beispiel könnten Sie bei einem Tag "acme: tag1" alle Knoten mit diesem Tag mit der einfachen Abfrage finden:
%Vor%Der Nachteil dieses Ansatzes besteht darin, dass die Pflege von Tags umständlich ist. Das Erstellen neuer Tags erfordert die Registrierung neuer Knotentypen. Sie können Tags nicht einfach umbenennen, sondern müssten das Mixin für das Tag mit dem neuen Namen erstellen. finde alle Knoten, bei denen das Mixin das alte Tag darstellt, entferne das alte Mixin und füge das neue hinzu; und schließlich die Knotentypdefinition für das alte Tag entfernen (nachdem es nirgendwo mehr verwendet wird). Das Entfernen alter Tags erfolgt auf ähnliche Weise. Ein weiterer Nachteil besteht darin, dass es nicht einfach ist, zusätzliche Metadaten (z. B. Anzeigename) mit einem Tag zu verknüpfen, da zusätzliche Eigenschaften für Knotentypdefinitionen nicht zulässig sind.
Dieser Ansatz sollte ziemlich gut funktionieren.
Option 2: Verwenden Sie eine Taxonomie und starke Referenzen
Bei diesem Ansatz würden Sie eine einfache Knotenstruktur in einem Bereich des Repositorys erstellen, in dem Sie einen Knoten für jedes Tag (z. B. eine Taxonomie) erstellen können. Auf diesem Knoten können Sie Eigenschaften festlegen, die das Tag beschreiben (z. B. Anzeigename). Diese Eigenschaften können jederzeit geändert werden (z. B. Umbenennen des Tags).
Um das Tag auf einen Knoten "anzuwenden", müssen Sie lediglich eine Art Beziehung zum Tag erstellen. Eine Möglichkeit besteht darin, einen Mixinknoten-Typ zu definieren, der eine mehrwertige Eigenschaft "acme: tags" vom Typ REFERENCE enthält. Wenn Sie ein oder mehrere Tags auf einen Knoten anwenden möchten, fügen Sie einfach das Mixin zum Knoten hinzu und legen Sie die Eigenschaft "acme: tags" auf die Tag-Knoten fest.
Um alle Knoten eines bestimmten Tags zu finden, können Sie "getReferences ()" auf einem Tag-Knoten aufrufen, um alle Knoten zu finden, die einen Verweis auf den Tag-Knoten enthalten.
Dieser Ansatz hat den Vorteil, dass alle Tags innerhalb einer oder mehrerer Taxonomien (einschließlich vielleicht benutzerspezifischer Taxonomien) kontrolliert / verwaltet werden müssen. Es gibt jedoch auch einige Nachteile. In erster Linie ist die Leistung der REFERENCE-Eigenschaften möglicherweise nicht groß. Einige JCR-Implementierungen raten von der Verwendung von REFERENCES insgesamt ab. ModeShape nicht, aber ModeShape kann die REFERENCE-Leistung beeinträchtigen, wenn viele Knoten vorhanden sind, die Verweise auf denselben Knoten enthalten (z. B. viele Knoten mit einem einzelnen Tag).
Option 3: Verwenden Sie Taxonomie und schwache Referenzen
Diese Option ist ein Hybrid, der der obigen Option 2 ähnelt, außer dass die Eigenschaften "acme: tags" anstelle von REFERENCE WEAKREFERENCE wären. Sie würden immer noch eine oder mehrere Taxonomien definieren und verwalten. Um Knoten mit einem bestimmten Tag zu finden, können Sie nicht die Methode "getReferences ()" für den Tag-Knoten verwenden (da sie nicht mit den Eigenschaften von WEAKREFERENCE arbeiten), aber Sie können dies leicht mit einer Abfrage tun:
%Vor%Dieser Ansatz erzwingt die Verwendung einer oder mehrerer Taxonomien und erleichtert die Kontrolle der Tags, da sie in einer Taxonomie vorhanden sein müssen, bevor sie verwendet werden können. Umbenennen und Entfernen ist auch einfacher. Leistungsmäßig ist dies besser als der REFERENCE-Ansatz, da die Eigenschaften von WEAKREFERENCE bei einer großen Anzahl von Referenzen besser sind, unabhängig davon, ob sie alle auf einen oder mehrere Knoten zeigen.
Der Nachteil ist, dass Sie ein Tag entfernen können, selbst wenn es noch verwendet wird, aber die Knoten, die eine WEAKREFERENCE für dieses entfernte Tag enthalten, sind nicht mehr gültig. Dies kann durch einige Konventionen in Ihrer Anwendung behoben werden oder indem einfach Metadaten zur Taxonomie verwendet werden, um zu sagen, dass ein bestimmtes Tag "veraltet" ist und nicht verwendet werden sollte. (IMO, letzteres ist tatsächlich ein Vorteil dieses Ansatzes.)
Diese Option wird im Allgemeinen viel besser als Option 2 ausgeführt und skaliert.
Option 4: Verwenden Sie Zeichenfolgeneigenschaften
Ein weiterer Ansatz besteht darin, einfach eine STRING-Eigenschaft zu verwenden, um jeden Knoten mit dem Namen der Tags zu versehen, die angewendet werden sollen. Sie könnten zum Beispiel ein Mixin (zB "acme: taggable") definieren, das eine mehrwertige STRING-Eigenschaft definiert. Wenn Sie einen Knoten markieren möchten, fügen Sie einfach das Mixin hinzu (falls nicht bereits vorhanden) und fügen Sie den Namen des Tag als Wert für die STRING-Eigenschaft "acme: tags" (wenn sie nicht bereits als Wert vorhanden ist).
Der Hauptvorteil dieses Ansatzes besteht darin, dass es sehr einfach ist: Sie verwenden einfach Zeichenfolgenwerte auf dem Knoten, der markiert werden soll. Um alle Knoten zu finden, die mit einem bestimmten Tag versehen sind (z. B. "tag1"), geben Sie einfach eine Abfrage aus:
%Vor%Die Verwaltung der Tags ist einfach: Es gibt keine Verwaltung. Wenn eine Variable umbenannt werden soll, können Sie die Variablenwerte umbenennen. Wenn ein Tag gelöscht werden soll (und aus den damit markierten Knoten entfernt werden soll), kann dies durch Entfernen der Werte aus den "acme: tags" -Eigenschaften (vielleicht in einem Hintergrundjob) geschehen.
Beachten Sie, dass damit jeder Tag-Name verwendet werden kann. Dies funktioniert am besten in Fällen, in denen die Tag-Namen überhaupt nicht kontrolliert werden. Wenn Sie die Liste der Strings, die als Tag-Werte verwendet werden, steuern möchten, erstellen Sie einfach eine Taxonomie im Repository (wie in den Optionen 2 und 3 oben beschrieben) und lassen Sie Ihre Anwendung die Werte auf die in der Taxonomie beschränken. Sie können sogar mehrere Taxonomien haben, von denen einige vielleicht benutzerspezifisch sind. Dieser Ansatz hat jedoch nicht die gleiche Kontrolle wie Option 2 oder 3.
Diese Option wird etwas besser sein als Option 3 (da die Abfragen einfacher sind), wird aber genauso skalieren.