在gremlin上过滤顶点

时间:2018-10-04 00:04:45

标签: gremlin

我具有顶点和边的组合路径,并且我试图仅针对顶点过滤它。我目前有以下-

g.V().outE().inV().outE().inV().path().unfold().filter(...)

一个人怎么能从这个无边的收藏中走出来?

2 个答案:

答案 0 :(得分:1)

有一秒钟,我将假设您的示例是您的实际查询,在这种情况下,只需消除如下所示的边沿遍历,就可以非常轻松地做到这一点:

g.V().out().out().path().unfold()

如果您的示例只是实际遍历的简化版本,则答案要复杂得多。给定“现代”玩具图,以下是一些选项:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().outE().inV().outE().inV().path()
==>[v[1],e[8][1-knows->4],v[4],e[10][4-created->5],v[5]]
==>[v[1],e[8][1-knows->4],v[4],e[11][4-created->3],v[3]]

因此,这是我最初建议的输出,因此我们可以与将使用outE().inV()的其他选项进行比较:

gremlin> g.V().out().out().path().unfold()
==>v[1]
==>v[4]
==>v[5]
==>v[1]
==>v[4]
==>v[3]

我想您可以标记您的步骤,然后select()全部删除:

gremlin> g.V().as('a').outE().inV().as('a').outE().inV().as('a').select(all,'a').unfold()
==>v[1]
==>v[4]
==>v[5]
==>v[1]
==>v[4]
==>v[3]

我通常尽可能地避免使用步骤标签,尽管如此,一种过滤出混合图形元素的方法是选择一种可以唯一标识它们的过滤器。例如,在现代图中,我知道顶点和边标签的列表是全局唯一的(没有与边标签相同的顶点标签),所以我可以这样做:

gremlin> g.V().outE().inV().outE().inV().path().unfold().hasLabel('person','software')
==>v[1]
==>v[4]
==>v[5]
==>v[1]
==>v[4]
==>v[3]

如果您有一些唯一命名的属性键或值,则可以使用has()做类似的技巧。如果您没有这些东西,则可能会使用效果不佳的Lambda卡住:

gremlin> g.V().outE().inV().outE().inV().path().unfold().filter{it.get() instanceof Vertex}
==>v[1]
==>v[4]
==>v[5]
==>v[1]
==>v[4]
==>v[3]

答案 1 :(得分:0)

考虑这个例子:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().repeat(outE().inV()).times(2).emit().path()
==>[v[1],e[9][1-created->3],v[3]]
==>[v[1],e[7][1-knows->2],v[2]]
==>[v[1],e[8][1-knows->4],v[4]]
==>[v[1],e[8][1-knows->4],v[4],e[10][4-created->5],v[5]]
==>[v[1],e[8][1-knows->4],v[4],e[11][4-created->3],v[3]]
==>[v[4],e[10][4-created->5],v[5]]
==>[v[4],e[11][4-created->3],v[3]]
==>[v[6],e[12][6-created->3],v[3]]

您知道每个其他路径元素都是一个顶点(并且每个其他元素都是一个边)。这允许您使用“by”修饰符为每个修饰符赋予“类型”(请记住,“by”步骤以循环方式对输入进行处理):

gremlin> g.V().repeat(outE().inV()).times(2).emit().path().
......1>   by(
......2>     project('item', 'type').
......3>       by(identity()).
......4>       by(constant('vertex'))).
......5>   by(
......6>     project('item', 'type').
......7>       by(identity()).
......8>     by(constant('edge')))
==>[[item:v[1],type:vertex],[item:e[9][1-created->3],type:edge],[item:v[3],type:vertex]]
==>[[item:v[1],type:vertex],[item:e[7][1-knows->2],type:edge],[item:v[2],type:vertex]]
==>[[item:v[1],type:vertex],[item:e[8][1-knows->4],type:edge],[item:v[4],type:vertex]]
==>[[item:v[1],type:vertex],[item:e[8][1-knows->4],type:edge],[item:v[4],type:vertex],[item:e[10][4-created->5],type:edge],[item:v[5],type:vertex]]
==>[[item:v[1],type:vertex],[item:e[8][1-knows->4],type:edge],[item:v[4],type:vertex],[item:e[11][4-created->3],type:edge],[item:v[3],type:vertex]]
==>[[item:v[4],type:vertex],[item:e[10][4-created->5],type:edge],[item:v[5],type:vertex]]
==>[[item:v[4],type:vertex],[item:e[11][4-created->3],type:edge],[item:v[3],type:vertex]]
==>[[item:v[6],type:vertex],[item:e[12][6-created->3],type:edge],[item:v[3],type:vertex]]

现在看看每个路径元素如何包含类型?现在更容易获得您想要的东西。

gremlin> g.V().repeat(outE().inV()).times(2).emit().path().
......1>   by(
......2>     project('item', 'type').
......3>     by(identity()).
......4>     by(constant('vertex'))).
......5>   by(
......6>     project('item', 'type').
......7>     by(identity()).
......8>     by(constant('edge'))).
......9>   unfold().
.....10>   where(select('type').is('vertex')).
.....11>   select('item').
.....12>   dedup()
==>v[1]
==>v[3]
==>v[2]
==>v[4]
==>v[5]
==>v[6]