使用图遍历的一部分的 属性 作为其他部分的过滤器
Use property of one part of graph traverse as filter for other
我要下一个:
- 遍历图的一部分
- 第一次遍历属性
- 作为过滤器放入其他遍历
- 获取筛选值
当我在 Gremlin 控制台中 运行 下一步时:
g = TinkerGraph.open().traversal()
g.addV('a').property(id, 1).property('b',2)
g.addV('a').property(id, 2).property('b',2).property('c',3)
g.V(2).properties().key().limit(1).as('q').select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
我得到:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('a').property(id, 1).property('b',2)
==>v[1]
gremlin> g.addV('a').property(id, 2).property('b',2).property('c',3)
==>v[2]
gremlin> g.V(2).properties().key().limit(1).as('q').select('q')
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
gremlin>
所以我可以看到:
- 我的第一个遍历路径得到 属性 个 'b'
- 通过直接使用文字进行选择 'b' 有效
- 使用投影过滤 'b' 不起作用。
所以问题是 - 在上述情况下如何使用一部分遍历的值作为其他遍历的过滤器?
我的用例是我有 prototype
个顶点。我想获取它的所有属性(可能是值),并找到与 prototype
.
相似的所有顶点
其他替代方法是将查询存储在 prototype
的 属性 中,读取它并对其求值以获得被它过滤的顶点。
我知道我可以在应用程序端连接字符串,但我只想留在 Gremlin 的代码较少的部分以具有适当的提供程序可移植性。
更新:
来自官方文档的示例:
gremlin> firstYear = g.V().hasLabel('person').
local(properties('location').values('startTime').min()).
max().next()
==>2004
gremlin> l = g.V().hasLabel('person').as('person').
properties('location').or(has('endTime',gt(firstYear)),hasNot('endTime')).as('location').
valueMap().as('times').
select('person','location','times').by('name').by(value).by().toList()
如何在控制台中没有变量的情况下使用 firstYear
,但要从查询中引用它?
我看到您的问题已在 Gremlin 用户列表中得到解答。 [1] 将答案复制到这里,以供可能搜索相同问题的其他人使用。
您要找的是:
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(eq('q'))
请参阅 Where 步骤的文档以了解 where 的不同使用模式。
[1] https://groups.google.com/forum/#!topic/gremlin-users/f1NfwUw9ZVI
我要下一个:
- 遍历图的一部分
- 第一次遍历属性
- 作为过滤器放入其他遍历
- 获取筛选值
当我在 Gremlin 控制台中 运行 下一步时:
g = TinkerGraph.open().traversal()
g.addV('a').property(id, 1).property('b',2)
g.addV('a').property(id, 2).property('b',2).property('c',3)
g.V(2).properties().key().limit(1).as('q').select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
我得到:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('a').property(id, 1).property('b',2)
==>v[1]
gremlin> g.addV('a').property(id, 2).property('b',2).property('c',3)
==>v[2]
gremlin> g.V(2).properties().key().limit(1).as('q').select('q')
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
==>b
gremlin> g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
gremlin>
所以我可以看到:
- 我的第一个遍历路径得到 属性 个 'b'
- 通过直接使用文字进行选择 'b' 有效
- 使用投影过滤 'b' 不起作用。
所以问题是 - 在上述情况下如何使用一部分遍历的值作为其他遍历的过滤器?
我的用例是我有 prototype
个顶点。我想获取它的所有属性(可能是值),并找到与 prototype
.
其他替代方法是将查询存储在 prototype
的 属性 中,读取它并对其求值以获得被它过滤的顶点。
我知道我可以在应用程序端连接字符串,但我只想留在 Gremlin 的代码较少的部分以具有适当的提供程序可移植性。
更新:
来自官方文档的示例:
gremlin> firstYear = g.V().hasLabel('person').
local(properties('location').values('startTime').min()).
max().next()
==>2004
gremlin> l = g.V().hasLabel('person').as('person').
properties('location').or(has('endTime',gt(firstYear)),hasNot('endTime')).as('location').
valueMap().as('times').
select('person','location','times').by('name').by(value).by().toList()
如何在控制台中没有变量的情况下使用 firstYear
,但要从查询中引用它?
我看到您的问题已在 Gremlin 用户列表中得到解答。 [1] 将答案复制到这里,以供可能搜索相同问题的其他人使用。
您要找的是:
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(eq('q'))
请参阅 Where 步骤的文档以了解 where 的不同使用模式。
[1] https://groups.google.com/forum/#!topic/gremlin-users/f1NfwUw9ZVI