Направленные отношения с разными именами для каждого направления - PullRequest
5 голосов
/ 03 мая 2011

На платформах 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 поддерживают это?

Ответы [ 3 ]

5 голосов
/ 04 мая 2011

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

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

Гремлин работает над парусными магазинами TinkerGraph, Neo4j, OrientDB, DEX и RDF.

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

2 голосов
/ 03 мая 2011

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

Для 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;
        }
    }
}
1 голос
/ 03 мая 2011

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

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

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

...