gremlin hasId должен быть эквивалентен id (). is (xxx) в apache-tinkerpop-gremlin-console-3.3.4-bin.zip - PullRequest
0 голосов
/ 07 ноября 2018

Исходя из моего понимания шага hasId, поведение id (). Is () должно быть таким же. Это означает, что следующий скрипт должен вывести тот же результат.

g.V().hasId(4)
g.V().id().is(4)

Но, к сожалению, шаг hasId (), кажется, не работает, как я ожидал, с моей стороны что-то не так? весь сценарий ниже FYI.

gremlin> g.addV('Orange').property('price', '1.79').property('location', 'location-0').property('_classname', 'com.microsoft.spring.data.gremlin.common.domain.Orange')
==>v[4]
gremlin> g.V().id().is(0)
==>0
gremlin> g.V().id()
==>0
==>4
gremlin> g.addV('Orange').property('price', '1.79').property('location', 'location-0').property('_classname', 'com.microsoft.spring.data.gremlin.common.domain.Orange')
==>v[8]
gremlin> g.V().id()
==>0
==>4
==>8
gremlin> g.V().hasId(8)
gremlin> g.V().id().is(8)
==>8

1 Ответ

0 голосов
/ 07 ноября 2018

Вы столкнулись с несогласованностью обработки идентификаторов вашего графа, и я предполагаю, что используемый вами график - TinkerGraph. Конфигурация по умолчанию для id поисков заключается в сравнении с помощью equals(), поэтому, используя ваш пример, вы можете увидеть, что происходит:

gremlin> g.V().hasId(0)
gremlin> g.V().hasId(0L)
==>v[0]

Так почему же это работает:

gremlin> g.V().id().is(0)
==>0

Для этого ответа мы сравниваем profile() каждого обхода:

gremlin> g.V().hasId(0L).profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[0])                                            1           1           0.755   100.00
                                            >TOTAL                     -           -           0.755        -
gremlin> g.V().id().is(0).profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[])                                             2           2           0.063    29.62
IdStep                                                                 2           2           0.089    41.73
IsStep(eq(0))                                                          1           1           0.061    28.65
                                            >TOTAL                     -           -           0.214        -

Они компилируются в два разных обхода. Первый показывает, что hasId() оптимизирован для одного TinkerGraphStep с примененным к нему id, что означает, что он использует поиск по индексу (и, следовательно, equals()). С другой стороны, когда вы используете is() таким способом, которым вы пользуетесь, оптимизатор запросов TinkerGraph не обращает на это внимания, а просто использует линейное сканирование идентификаторов и фильтр в памяти с IsStep. IsStep умнее сравнивает числа, чем TinkerGraphStep, и он просто знает, что «0» - это «0», и игнорирует тип.

Вы можете получить то же поведение от TinkerGraph, хотя вы переконфигурируете его IdManager, как описано в Practical Gremlin и справочной документации :

gremlin> conf = new BaseConfiguration()
==>org.apache.commons.configuration.BaseConfiguration@2c413ffc
gremlin> conf.setProperty("gremlin.tinkergraph.vertexIdManager","LONG")
gremlin> conf.setProperty("gremlin.tinkergraph.edgeIdManager","LONG")
gremlin> conf.setProperty("gremlin.tinkergraph.vertexPropertyIdManager","LONG");[]
gremlin> graph = TinkerGraph.open(conf)
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('Orange').property('price', '1.79').property('location', 'location-0').property('_classname', 'com.microsoft.spring.data.gremlin.common.domain.Orange')
==>v[0]
gremlin> g.V(0)
==>v[0]
gremlin> g.V().hasId(0)
==>v[0]
gremlin> g.V().id().is(0)
==>0
...