Сначала я отвечу на вопрос 2, так как это поможет мне ответить на вопрос 1.
2) Концептуально API Tinkerpop рассматривает свойства вершин (и свойства свойств вершин) как вершины графа.В результате API ожидает, что свойства вершин будут вести себя как вершины, и переход от вершины к каждому из своих свойств имитирует свойства двух вершин, соединенных и ребра:
v1 ---> uuid
, где будет храниться вершина uuidзначение uuid.По этой причине текущая реализация НЕ хранит свойства вершины в документе вершины, но в отдельном документе (в коллекции * _ELEMENT-PROPERTIES).Основное преимущество этого подхода заключается в том, что он значительно упростил реализацию.Один из недостатков заключается в том, что, как вы упомянули, смотреть на свойства вершины в пользовательском интерфейсе не так просто: вам нужен запрос вместо простого открытия документа вершины.Кстати, запрос, который вы можете использовать для этого:
WITH @@vertexlabel
FOR v, e
IN OUTBOUND @startrVertexID
@@propertiesEdge
RETURN {"name": v.key, "value": v.value}
, где вы можете указать желаемую метку / коллекцию вершин, идентификатор интересующей вершины и соответствующее propertiesEdge имя коллекции (т.е.* _ELEMENT-PROPERTIES).
1) Текущая реализация не позволяет предоставлять индексы для определенных атрибутов, поскольку свойства хранятся в виде документов, и, следовательно, мы не можем использовать их в качестве индексов.Как упоминалось в camba1, ArangoDB автоматически индексирует _key в документах, поэтому вы можете использовать пользовательские значения ключей, если хотите убедиться, что поиск, основанный на определенном атрибуте, основан на индексе.Пользовательские значения _key используются путем предоставления пользовательских идентификаторов.Обратите внимание, что arangodb-tinkerpop-provider поддерживает только пользовательские идентификаторы вершин / ребер / свойств типа string (с некоторыми предостережениями ).Таким образом, в вашем случае вы можете использовать UUID в качестве идентификатора вершины:
graph = GraphFactory.open(conf);
GraphTraversalSource g = gts.clone();
UUID userId1 = UUID.randomUUID();
Vertex vertex1 = graph.addVertex("person").properties(T.id, userId1.toString());
И затем вы можете найти эту вершину по идентификатору (который будет проиндексирован);
System.out.println(g.V("*_vertex/" + userId1).properties().toList());
(Обратите внимание, что вам необходимо заменить * на имя нашего графика.)
В настоящее время открыта ошибка для изменения хранилища свойств: Проблема 38 , и я начал работу над возможным решением длякоторые вы можете найти подробности в комментариях к ошибке.Пожалуйста, не стесняйтесь вносить любые идеи!
Спасибо за использование поставщика!