Relations directionnelles avec un nom différent pour chaque direction
-
28-10-2019 - |
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?
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) .