Question

Dans les plates-formes GraphDB (Neo4j, orientdb, flockdb, hypergraphdb ...), il est possible de définir les relations entre les nœuds.

J'ai besoin de définir des relations directionnelles, de sorte que la relation a des noms différents en fonction de sa direction.

Par exemple:

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

Ensuite, je souhaite traverser ou interroger un graphique en utilisant les termes et les directions.

Bien sûr, je ne veux pas définir deux relations, mais une seule.

Parfois, je veux même utiliser un nom non directionnel, par exemple:

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

Et utiliser une traversée / requêtes directionnelles ou indirections

Par exemple, je peux vouloir demander:

Get any X that TalkWith(A,X))

ou

Get any X that Call(A,X))

ou

Get any X that Answer(A,X))

Quelles plates-formes GraphDB existantes le prennent en charge?

Était-ce utile?

La solution

Dans Gremlin (http://gremlin.tinkerpop.com), vous pouvez créer des relations abstraites / implicites / déduites de ce qui est explicite dans les données. En tant que tel, vous pouvez définir les inférences de cette manière.

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

Gremlin travaille dans les magasins de voile Tinkergraph, Neo4j, OrientDB, DEX et RDF.

J'espère que cela aide, Marko.

Autres conseils

Cela ressemble à un problème de niveau UI, pas à un problème de base de données. Vous essayez de cartographier les relations dirigées vers un nom respectueux de l'homme.

Pour NEO4J, vous pouvez mettre ces informations dans votre type de relation personnalisé:

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;
        }
    }
}

Dans Infoger, nous avons le concept de relations non dirigées. Par exemple, "Hasmet": Si la personne A a rencontré la personne B, nécessairement B a également rencontré A, et A et B jouent les mêmes rôles dans la relation.

Notez que l'unidirectionnalité va au-delà de la dénomination, c'est un concept sémantique central qui peut ou non être compris par une base de données ou un langage de modélisation.

En outre, dans Infogride, vous pouvez vous définir quelques spécifications de traversées et les alias à ce que vous voulez, y compris les traversées de base (allez aux voisins liés par un type particulier de relation), ou des traversées en plusieurs étapes (par exemple, aller aux oncles du côté de votre mère) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top