Направленные отношения с различным именем для каждого направления

StackOverflow https://stackoverflow.com/questions/5867018

Вопрос

На платформах GraphDB (NEO4J, OrientDB, FlockDB, HyperGraphDB ...) можно определить отношения между узлами.

Мне нужно определить направленные отношения, так что отношение имеет разные имена в зависимости от его направления.

Например:

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

Затем я хочу пройти или запрашивать график, используя как термины, так и направления.

Конечно, я не хочу определять две отношения, но только одну.

Иногда я даже хочу использовать не направленное имя, например:

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

И используйте направленные или косвенные обходы / запросы

Например, я могу спросить:

Get any X that TalkWith(A,X))

или же

Get any X that Call(A,X))

или же

Get any X that Answer(A,X))

Какие существующие платформы GraphDB поддерживают его?

Это было полезно?

Решение

В Gremlin (http://gremlin.tinkerpop.com) вы можете создавать абстрактные/неявные/предполагаемые отношения из того, что явно в данных. Таким образом, вы можете определить выводы таким образом.

https://github.com/tinkerpop/gremlin/wiki/user-defience-Steps

Gremlin работает над магазинами Tinkergraph, Neo4J, OrientDB, DEX и RDF.

Надеюсь, это поможет, Марко.

Другие советы

Это звучит как проблема, а не на уровне базы данных. Вы пытаетесь сопоставить направленные отношения с человеческим именем.

Для NEO4J вы можете поместить эту информацию в свои пользовательские отношения:

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

В Инфогрид, у нас есть концепция неисправенных отношений. Например, «Hasmet»: если человек A встретил человека B, обязательно B также встретил A, а A и B играют ту же роль в отношениях.

Обратите внимание, что однонаправленность выходит за рамки именования, это основная семантическая концепция, которая может или не может быть понята с помощью базы данных или языка моделирования.

Кроме того, в Infogrid вы можете определить себя несколько обезвреживаний и псевдоним их на все, что вам нравится, включая основные обходы (перейдите к соседям, связанным с определенным типом отношений), или многоэтапные проходы (например, идите к дядям со стороны вашей матери) Анкет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top