Вы столкнулись с несогласованностью обработки идентификаторов вашего графа, и я предполагаю, что используемый вами график - 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