Relazioni direzionali con nome diverso per ogni direzione
-
28-10-2019 - |
Domanda
Nelle piattaforme GraphDB (Neo4j, OrientDB, FlockDB, HyperGraphDB ...) è possibile definire le relazioni tra i nodi.
Devo definire le relazioni direzionali, in modo tale che la relazione abbia nomi diversi a seconda della sua direzione.
Per esempio:
Parent(A,B) := Sibling(B,A).
Quindi, voglio attraversare o interrogare un grafico usando sia termini che direzioni.
Certo, non voglio definire due relazioni, ma solo una.
A volte voglio persino usare un nome non direttivo, ad esempio:
Call(A,B) := Answer(B,A);
TalkWith(A,B) := Call(A,B) || Call(B,A)
E usa un traversa / query direzionali o indirezionali
Ad esempio, potrei voler chiedere:
Get any X that TalkWith(A,X))
o
Get any X that Call(A,X))
o
Get any X that Answer(A,X))
Quali piattaforme GraphDB esistenti lo supportano?
Soluzione
In Gremlin (http://gremlin.tinkerpop.com), è possibile creare relazioni astratte/implicite/inferite da ciò che è esplicito nei dati. Pertanto, puoi definire le inferenze in questo modo.
https://github.com/tinkerpop/gremlin/wiki/user-defined-peps
Gremlin lavora su magazzini Tinkergraph, Neo4j, OrientDB, Dex e RDF.
Spero che questo aiuti, Marko.
Altri suggerimenti
Sembra un problema di livello USE, non a livello di database. Stai tentando di mappare le relazioni dirette a un nome amichevole per l'uomo.
Per Neo4j, potresti inserire queste informazioni nella tua relazione personalizzata:
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;
}
}
}
In Infogriglia, abbiamo il concetto di relazioni non indirizzate. Ad esempio, "Hasmet": se la persona A ha incontrato la persona B, necessariamente B ha incontrato anche A e A e B svolgono gli stessi ruoli nella relazione.
Si noti che unidirezionalità va oltre la denominazione, è un concetto semantico fondamentale che può o meno essere compreso da un database o da un linguaggio di modellazione.
Inoltre, in Infogrid potresti definirti alcune specifiche di traversa e alias per quello che vuoi, compresi i traversari di base (vai ai vicini legati da un particolare tipo di relazione) o traversa multi-step (ad esempio vai a zii dalla parte di tua madre) .