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

На платформах 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))

or

Get any X that Call(A,X))

or

Get any X that Answer(A,X))

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


person Lior Kogan    schedule 03.05.2011    source источник
comment
Мне кажется, что Гремлин мог поддержать это, используя шаги, определяемые пользователем   -  person nawroth    schedule 04.05.2011


Ответы (3)


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

https://github.com/tinkerpop/gremlin/wiki/User-Defined-Steps

Gremlin работает с TinkerGraph, Neo4j, OrientDB, DEX и RDF Sail Stores.

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

person Marko A. Rodriguez    schedule 04.05.2011

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

Для Neo4j вы можете поместить эту информацию в свой собственный RelationshipType:

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;
        }
    }
}
person ajlane    schedule 03.05.2011
comment
Я не уверен, насколько это было бы полезно, так как вам все равно придется делать MyRelationshipType.valueOf (RelationsRetrievedFromTheDb.name ()) или что-то в этом роде при извлечении из базы данных. Тем не менее, я сам использовал похожий шаблон :-) Что касается направления отношений, вы правы, это не проблема БД: вы можете получить исходящие / входящие отношения или игнорировать направление в Neo4j. - person nawroth; 04.05.2011

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

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

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

person Johannes Ernst    schedule 03.05.2011
comment
Ненаправленные отношения - это хорошо, но все же это не то, что я хочу. - person Lior Kogan; 03.05.2011