Gremlin P.eq 可以接受顶点吗?

问题描述

我正在尝试应用 Element Existence recipe 以仅插入一条被视为“有效”(而非“过期”)的边:

def to = __.V(member).hasLabel('Member')

gts.V(group).hasLabel('Group')
  .coalesce(
    __.outE('Includes').hasNot('ttl.end').where(__.inV().is(P.eq(to))),__.addE('Includes').to(to).property('ttl.start',timestamp)
  )
  .next()

我的期望是合并将选择没有 ttl.end 属性并且与同一个 to 顶点关联的现有边,否则插入新边。但是,无论如何总是会插入一条新边。我将此解释为表明第一个子遍历与现有的实时边缘不匹配,但我不知道为什么。谓词 P.eq 是否适用于 Traversal<?,Vertex> 参数?如果不是,那么“边在顶点 to 上的终止位置”的正确说法是什么?

配置文件(我注意到 Isstep 没有遍历器,我认为这意味着它不匹配):

Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkergraphStep(vertex,[08f8c62d-5429-40e6-84b7...                     1           1           0.135    10.93
CoalesceStep([[VertexStep(OUT,[Includes],edge),...                     1           1           0.781    63.17
  VertexStep(OUT,edge)                                      2           2           0.025
  NotStep([Propertiesstep([ttl.end],value),Pro...                     1           1           0.127
    Propertiesstep([ttl.end],value)                                                            0.033
  TraversalFilterStep([EdgeVertexStep(IN),Prof...                                             0.144
    EdgeVertexStep(IN)                                                 1           1           0.014
    Isstep(eq([TinkergraphStep(vertex,[d9b69296...                                             0.018
  AddEdgeStep({ttl.start=[Thu Jan 28 21:27:52 C...                     1           1           0.220
    TinkergraphStep(vertex,[d9b69296-333e-4e54-...                     1           1           0.120

解决方法

两者都可以:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6],standard]
gremlin> v = g.V(1).next()
==>v[1]
gremlin> g.V().bothE().where(outV().is(v))
==>e[9][1-created->3]
==>e[7][1-knows->2]
==>e[8][1-knows->4]
==>e[7][1-knows->2]
==>e[9][1-created->3]
==>e[8][1-knows->4]
gremlin> g.V().bothE().where(outV().is(eq(v)))
==>e[9][1-created->3]
==>e[7][1-knows->2]
==>e[8][1-knows->4]
==>e[7][1-knows->2]
==>e[9][1-created->3]
==>e[8][1-knows->4]

请注意,您的代码示例并未显示您向 Vertexis() 提供 eq()。以下:

def to = __.V(member).hasLabel('Member')

永远不会得到 Vertex,因为 traversal is not iterated。因此,to 只是一个 Traversal,它肯定不会在您的 where() 中提供任何匹配项。