Frage

In GraphDB -Plattformen (NEO4J, Orientdb, FlockDB, Hypergraphdb ...) ist es möglich, Beziehungen zwischen Knoten zu definieren.

Ich muss Richtungsbeziehungen definieren, so dass die Beziehung je nach Richtung unterschiedliche Namen hat.

Zum Beispiel:

Parent(A,B) := Sibling(B,A).

Dann möchte ich ein Diagramm mit sowohl Begriffen als auch Richtungen durchquerieren oder abfragen.

Natürlich möchte ich nicht zwei Beziehungen definieren, sondern nur einen.

Manchmal möchte ich sogar einen nicht-leitenden Namen verwenden, zum Beispiel:

Call(A,B) := Answer(B,A);
TalkWith(A,B) := Call(A,B) || Call(B,A)

Und verwenden Sie eine Richtungs- oder indirekte Traverals / Abfragen

Zum Beispiel möchte ich fragen:

Get any X that TalkWith(A,X))

oder

Get any X that Call(A,X))

oder

Get any X that Answer(A,X))

Welche vorhandenen GraphDB -Plattformen unterstützen es?

War es hilfreich?

Lösung

In Gremlin (http://gremlin.tinkerpop.com) können Sie abstrakte/implizite/abgeleitete Beziehungen aus dem erstellen, was explizit in den Daten ist. Als solches können Sie Aufmerksamkeit auf diese Weise definieren.

https://github.com/tinkerpop/gremlin/wiki/user-defined-teps

Gremlin arbeitet über Tinkergraph-, Neo4J-, Orientdb-, Dex- und RDF -Segelgeschäfte.

Hoffe das hilft, Marko.

Andere Tipps

Das klingt nach einem Ui-Level-Problem, nicht nach einer Datenbankebene. Sie versuchen, die gerichteten Beziehungen auf einen menschenfreundlichen Namen abzubilden.

Für NEO4J können Sie diese Informationen in Ihren benutzerdefinierten Beziehungstyp einfügen:

public enum MyRelationshipType implements RelationshipType
{
    CHILD("Parent Of", "Child Of");

    public MyRelationshipType(final String forwardString, final String backwardString)
    {
        this.forwardString = forwardString;
        this.backwardString = backwardString;
    }

    private final String backwardString;

    private final String forwardString;

    public String getDisplayString(final boolean forward)
    {
        if (forward)
        {
            return this.forwardString;
        }
        else
        {
            return this.backwardString;
        }
    }
}

Im Infogrid, Wir haben das Konzept ungerichteter Beziehungen. Zum Beispiel "Hasmet": Wenn Person A Person B getroffen hat, hat B notwendigerweise auch A getroffen, und A und B spielen die gleiche Rolle in der Beziehung.

Beachten Sie, dass die Unidirektionalität über die Benennung hinausgeht. Es ist ein zentrales semantisches Konzept, das von einer Datenbank oder einer Modellierungssprache verstanden werden kann oder nicht.

Außerdem können Sie sich in Infogrid ein paar Traversspezifikationen definieren und sie zu allem, was Sie möchten,, einschließlich grundlegender Traverals (gehen Sie zu Nachbarn, die von einer bestimmten Art von Beziehung verwandt sind) oder mehrstufige Traverals (z. B. Gehen Sie zu Onkel auf der Seite Ihrer Mutter) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top