#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. Неориентированные отношения хороши, но все же они не делают того, что я хочу.