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())
我有这样的查询
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())