在 Gremlin 中是否可以从内部步骤获取 select 数据
Is it possible in Gremlin to select data from inner steps
我有案例
我需要 select node_1
,它有一些优势,或者 select 只是一个 node_1
本身
traversal()
.V().hasLabel("label_1")
.has("property_key", P.within(numbers)).as("node_1")
.or(
__.bothE().hasLabel("label_2").dedup().as("rels").otherV().as("node_2"),
__.constant(true)
)
.project("n1","r", "n2")
.by(__.select("node_1"))
.by(__.coalesce(__.unfold().select("rels"), __.unfold()))
.by(__.coalesce(__.unfold().select("node_2"), __.unfold()))
.toList()
但结果,当我观看 rels
时,有一个 node_1
。
而在一个node_2
中,还有一个node_1
您可以看到:
我猜是因为gremlin在步骤结构中找不到rels
和node_2
但在图中 - 存在这样的顶点和边
所以如果我写的一样没有“或”
traversal()
.V().hasLabel("label_1")
.has("property_key", P.within(numbers)).as("node_1")
.bothE().hasLabel("label_2").dedup().as("rels").otherV().as("node_2")
.project("n1","r", "n2")
.by(__.select("node_1"))
.by(__.select("rels"))
.by(__.select("node_2"))
.toList()
我得到了结果
如你所见
我明白,在第一种情况下,__.unfold()
被触发,所以我们得到了 node_1
无处不在
但是我如何获得 rels
或 node_2
- 我无法理解
是否有任何解决方案可以从 or
步骤
获取步骤
或者也许还有其他解决方案
"node_1" + "rels" + "node_2"
或仅查找
"node_1" + default_value + default_value
仅使用一个查询
感谢回答!
P.S.
这里有一些文本可以更好地在 google 中搜索,我在搜索答案时使用了这些查询,从浏览器历史记录中获取它:
gremlin select 从 or 开始,
gremlin select 内部步骤,
gremlin select 步骤,
gremlin select 内部步骤名称,
gremlin select 乘以步骤名称,
里面的 gremlin or
过滤器内部没有从以下位置到 select()
的路径:
gremlin> g.inject(1,2,3).as('a').or(__.is(1).as('b'),__.is(2).as('c')).path()
==>[1]
==>[2]
gremlin> g.inject(1,2,3).as('a').filter(__.is(1).as('b')).path()
==>[1]
您实际上需要让 Gremlin 遍历一条路径才能将其添加到历史记录中。我不确定我是否遵循了您要执行的操作,但我认为您可以将整个遍历的结构简化为:
g.V().hasLabel("label_1").
has("property_key", P.within(numbers)).
coalesce(bothE("label_2").elementMap(),
identity())
这样,您的条件由 coalesce()
处理,每条边都得到 returned。如果您需要 return 两个顶点上的数据,您显然可以用更强大的东西替换 elementMap()
- 也许只需用 project()
变体替换它。
我有案例
我需要 select node_1
,它有一些优势,或者 select 只是一个 node_1
本身
traversal()
.V().hasLabel("label_1")
.has("property_key", P.within(numbers)).as("node_1")
.or(
__.bothE().hasLabel("label_2").dedup().as("rels").otherV().as("node_2"),
__.constant(true)
)
.project("n1","r", "n2")
.by(__.select("node_1"))
.by(__.coalesce(__.unfold().select("rels"), __.unfold()))
.by(__.coalesce(__.unfold().select("node_2"), __.unfold()))
.toList()
但结果,当我观看 rels
时,有一个 node_1
。
而在一个node_2
中,还有一个node_1
您可以看到:
我猜是因为gremlin在步骤结构中找不到rels
和node_2
但在图中 - 存在这样的顶点和边
所以如果我写的一样没有“或”
traversal()
.V().hasLabel("label_1")
.has("property_key", P.within(numbers)).as("node_1")
.bothE().hasLabel("label_2").dedup().as("rels").otherV().as("node_2")
.project("n1","r", "n2")
.by(__.select("node_1"))
.by(__.select("rels"))
.by(__.select("node_2"))
.toList()
我得到了结果
如你所见
我明白,在第一种情况下,__.unfold()
被触发,所以我们得到了 node_1
无处不在
但是我如何获得 rels
或 node_2
- 我无法理解
是否有任何解决方案可以从 or
步骤
或者也许还有其他解决方案
"node_1" + "rels" + "node_2"
或仅查找
"node_1" + default_value + default_value
仅使用一个查询
感谢回答!
P.S.
这里有一些文本可以更好地在 google 中搜索,我在搜索答案时使用了这些查询,从浏览器历史记录中获取它:
gremlin select 从 or 开始, gremlin select 内部步骤, gremlin select 步骤, gremlin select 内部步骤名称, gremlin select 乘以步骤名称, 里面的 gremlin or
过滤器内部没有从以下位置到 select()
的路径:
gremlin> g.inject(1,2,3).as('a').or(__.is(1).as('b'),__.is(2).as('c')).path()
==>[1]
==>[2]
gremlin> g.inject(1,2,3).as('a').filter(__.is(1).as('b')).path()
==>[1]
您实际上需要让 Gremlin 遍历一条路径才能将其添加到历史记录中。我不确定我是否遵循了您要执行的操作,但我认为您可以将整个遍历的结构简化为:
g.V().hasLabel("label_1").
has("property_key", P.within(numbers)).
coalesce(bothE("label_2").elementMap(),
identity())
这样,您的条件由 coalesce()
处理,每条边都得到 returned。如果您需要 return 两个顶点上的数据,您显然可以用更强大的东西替换 elementMap()
- 也许只需用 project()
变体替换它。