Gremlin 如何过滤投影的结果?

Gremlin how to filter the results of a projection?

我有这样的查询

g.V.has('id', 1).outE()
        .project('edge','vertex')
           .by(valueMap('number'))
           .by(inV().valueMap())

它 return 是一本看起来像这样的字典: {“边”:{ ...},“顶点”:{ ...,“城市”:一个值,...}

我想根据 inV() 顶点的值过滤它。顶点有一个名为“城市”的 属性,在我进行投影后,我想过滤掉所有城市名称不是纽约的结果。

我试过了

g.V().has('id', 1).outE()
        .project('edge','vertex')
           .by(valueMap('number'))
           .by(inV().valueMap())
.filter(select('vertex').select('city').is(eq("New York"))) 

但它return什么都没有

一种简单的方法是根据您的要求将传入遍历过滤到项目之前的步骤。

 g.V().
 hasId("1").
 outE().as("a").
 inV().
 has("name", "New York").as("b").
 project("edge", "vertex").
   by(select("a").valueMap("number")).
   by(select("b").valueMap())

我认为如果您像 PrashantUpadhyay 提供的答案那样选择预先过滤,您的遍历将更具可读性并且性能可能更好。如果我可以建立在这个想法的基础上,我只是提出最好通过删除所有步骤标签并​​以这种方式进行过滤来摆脱打开路径跟踪的需要:

g.V().has('id', 1).outE().
  filter(inV().has('name','New York')).
  project('edge','vertex').
    by(valueMap('number')).
    by(inV().valueMap())

如果您出于某种原因绝对必须过滤结果 Map,那么:

g.V().has('id', 1).outE().
  project('edge','vertex').
    by(valueMap('number')).
    by(inV().valueMap()).
  filter(select('vertex').select('city').unfold().is(eq("New York")))

问题是 valueMap() 生成 List,因此您必须 unfold() 才能评估内容。我想如果您不需要结果中的 List,您也可以在 valueMap() 中完成 unfold()

g.V().has('id', 1).outE().
  project('edge','vertex').
    by(valueMap('number')).
    by(inV().valueMap().by(unfold())).
  filter(select('vertex').select('city').is(eq("New York")))

您的查询看起来是正确的,但是如果没有脚本来重现您的数据,则很难验证可能有什么问题。但是,使用此查询,您应该能够重写它以过滤 project() 之前的遍历器,如下所示。这将最大限度地减少遍历器的数量并最有可能提高性能:

g.V().has('id', 1).has('city', 'New York').as('a').outE()
    .project('edge','vertex')
       .by(valueMap('number'))
       .by(select('a').valueMap())