gpt4 book ai didi

spring-data - gremlin hasId 应该等同于 apache-tinkerpop-gremlin-console-3.3.4-bin.zip 中的 id().is(xxx)

转载 作者:行者123 更新时间:2023-12-05 03:04:06 28 4
gpt4 key购买 nike

根据我对 hasId 步骤的理解,它应该与 id().is() 步骤的行为相同。这意味着后续脚本应该打印相同的结果。

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

但不幸的是,hasId() 这一步似乎没有像我预期的那样工作,我这边有什么问题吗?整个脚本在下面仅供引用。

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

最佳答案

您在图形处理 id 时遇到了不一致的情况,我假设您使用的图形是 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 查询优化器不会注意到这一点,而只是使用 id 的线性扫描和内存中的过滤器使用 IsStepIsStep 在数字比较方面比 TinkerGraphStep 更聪明,它只知道“0”是“0”而忽略类型。

如果您重新配置其 IdManager,您可以从 TinkerGraph 获得相同的行为,如 Practical Gremlin 中所述和 Reference Documentation :

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

关于spring-data - gremlin hasId 应该等同于 apache-tinkerpop-gremlin-console-3.3.4-bin.zip 中的 id().is(xxx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com