ArangoDb Tinkerpop создал вершину - как индексировать пользовательские свойства - PullRequest
0 голосов
/ 28 декабря 2018

Я использую провайдер arangodb tinkerpop (https://github.com/ArangoDB-Community/arangodb-tinkerpop-provider) и создаю вершину, подобную этой:

graph = GraphFactory.open(conf);
GraphTraversalSource g = gts.clone();

UUID userId1 = UUID.randomUUID();

Vertex vertex1 = graph.addVertex("person");
vertex1.property("uid", userId1);

Все работает нормально, и я вижу, что могу найти свою начальную вершину с помощью этого запроса gremlin:

System.out.println(g.V().has("uid", userId1).properties().toList());

Теперь у меня два вопроса:

1) Все ли свойства вершин доступны для поиска по индексу или я могу создать индекс специально для этого свойства?

2) внутри коллекций (веб-интерфейс от ArangoDb) я не видел свои свойства - чтобы увидеть свойства, мне нужно заглянуть в * _ELEMENT-PROPERTIES - есть ли другая возможность увидеть свойства внутри представления коллекций?

Спасибо за помощь.Marcel

1 Ответ

0 голосов
/ 04 марта 2019

Сначала я отвечу на вопрос 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 , и я начал работу над возможным решением длякоторые вы можете найти подробности в комментариях к ошибке.Пожалуйста, не стесняйтесь вносить любые идеи!

Спасибо за использование поставщика!

...