Pregunta

En las plataformas GraphDB (Neo4J, OrientDB, FlockDB, HypergraphDB ...) es posible definir las relaciones entre los nodos.

Necesito definir relaciones direccionales, de modo que la relación tenga diferentes nombres dependiendo de su dirección.

Por ejemplo:

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

Luego, quiero atravesar o consultar un gráfico utilizando ambos términos y direcciones.

Por supuesto, no quiero definir dos relaciones, sino solo una.

A veces incluso quiero usar un nombre no direccional, por ejemplo:

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

Y use un recorrido / consultas direccionales o indireccionales

Por ejemplo, es posible que quiera preguntar:

Get any X that TalkWith(A,X))

o

Get any X that Call(A,X))

o

Get any X that Answer(A,X))

¿Qué plataformas GraphDB existentes lo admiten?

¿Fue útil?

Solución

En Gremlin (http://gremlin.tinkerpop.com), puede crear relaciones abstractas/implícitas/inferidas de lo que es explícito en los datos. Como tal, puede definir inferencias de esta manera.

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

Gremlin trabaja sobre las tiendas TinkerGraph, Neo4J, Orientdb, Dex y RDF Sail.

Espero que eso ayude, Marko.

Otros consejos

Eso suena como un problema de nivel UI, no un nivel de base de datos. Estás intentando mapear las relaciones dirigidas a un nombre amigable para los humanos.

Para Neo4J, puede poner esta información en su tipo de relación personalizada:

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

En Infogrid, tenemos el concepto de relaciones no dirigidas. Por ejemplo, "Hasmet": si la persona A ha conocido a la persona B, necesariamente B también ha cumplido A, y A y B juegan los mismos roles en la relación.

Tenga en cuenta que la unidireccionalidad va más allá de los nombres, es un concepto semántico central que puede o no ser entendido por una base de datos o lenguaje de modelado.

Además, en InfoGrid, puede definirse algunas especificaciones de traversales y alias a lo que quiera, incluidos los recorridos básicos (vaya a vecinos relacionados por un tipo particular de relación) o traversales de varios pasos (por ejemplo, vaya a los tíos al lado de su madre) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top