Используя Tinkerpop Gremlin (Neptune DB), есть ли предпочтительный/"более быстрый" способ запроса?
Например, допустим, у меня есть граф, содержащий узел:
label: Student
id: 'student/12345'
studentId: '12345'
name: 'Bob'
Есть ли предпочтительный запрос? (для этого примера предположим, что мы знаем значение поля «studentId», которое также является частью идентификатора)
g.V().filter('studentId', '12345')
против
g.V().filter(hasId(TextP.containing('12345'))
или используя "has"/"hasId" вместо "filter"?
g.V().has('studentId', '12345')
против
g.V().hasId(TextP.containing('12345'))
Таким образом, здесь есть два вопроса: один о filter()
и has()
, а другой об использовании идентификатора вершины вместо свойства.
Ответ на первый вопрос будет зависеть от базовой реализации базы данных и от того, что было или не было оптимизировано. В целом и в Neptune я бы предложил использовать шаблон g.V().has('studentId', '12345')
для фильтрации свойства, поскольку он оптимизирован и легче читается.
Ответ на второй вопрос также зависит от реализации базы данных, так как не все позволяют устанавливать идентификаторы вершин. Другие базы данных могут отличаться, но в настройках Neptune идентификаторы разрешены, и прямой поиск по идентификатору является самым быстрым (например, g.V('12345')
или g.V().hasId('12345')
) способом поиска чего-либо, поскольку это поиск по одному индексу. Следует отметить, что в Neptune значения идентификаторов вершин/ребер должны быть глобально уникальными, поэтому вам необходимо убедиться, что у вас будет только одна вершина или ребро с определенным идентификатором.
В этом примере они вернут разные результаты. Пример TextP.containing
с возвратом любых вершин, где идентификатор содержит 12345
, а второй вернет только одну вершину, где идентификатор равен student/12345
Да, я понимаю это. Извините, я имел в виду, что между ними существует разница в производительности, если идентификатор 'student/12345'
уникален, поскольку в нем нет других идентификаторов с 12345
(поэтому в этом случае оба примера будут ТОЛЬКО возвращать одну и ту же вершину). Кроме того, что предпочтительнее g.V().hasId(TextP.contains('12345')
или g.V().has('studentId', '12345')
? Еще раз спасибо!
Спасибо. Есть ли разница при использовании TextP в
hasId()
? Например,g.V().hasId(TextP.contains('12345')
противg.V().hasId('student/12345')
. И да, идентификаторы уникальны.