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

#nosql #neo4j #graph-databases #orientdb

#nosql #neo4j #графические базы данных #orientdb

Вопрос:

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

Комментарии:

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

Ответ №1:

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

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

Gremlin работает с хранилищами TinkerGraph, Neo4j, OrientDB, DEX и RDF Sail.

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

Ответ №2:

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

Для 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;
        }
    }
}
  

Комментарии:

1. Я не уверен, насколько это было бы полезно, поскольку вам все равно пришлось бы выполнять MyRelationshipType.valueOf(relationshipRetrievedFromTheDb.name ()) или что-то подобное при извлечении из базы данных. Тем не менее, я на самом деле использовал аналогичный шаблон сам 🙂 Что касается направления отношений, вы правы, это не проблема с БД: вы можете извлекать исходящие / входящие отношения или игнорировать направление в Neo4j.

Ответ №3:

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

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

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

Комментарии:

1. Неориентированные отношения хороши, но все же они не делают того, что я хочу.