gremlin 路口操作
gremlin intersection operation
我正在使用 gremlin 控制台 v3.3.1。
使用教程中的 "Modern" 图:
http://tinkerpop.apache.org/docs/current/tutorials/getting-started/
用这个创建图表:
gremlin>graph = TinkerFactory.createModern()
gremlin>g = graph.traversal()
我可以像这样找到所有认识 "vadas" 的人:
g.V().hasLabel('person').has('name', 'vadas').in('knows').hasLabel('person').valueMap()
我可以找到所有创建该软件 "lop" 的人:
g.V().hasLabel('software').has('name', 'lop').in('created').hasLabel('person').valueMap()
我可以找到所有知道 "vadas" 或通过合并操作创建 "lop" 的人:
g.V().union(
g.V().hasLabel('person').has('name', 'vadas').in('knows').hasLabel('person'),
g.V().hasLabel('software').has('name','lop').in('created').hasLabel('person')
).dedup().valueMap()
但我不知道如何找到所有知道 "vadas" 并创建 "lop" 的人。本质上我想要一个 INTERSECT 操作(我认为),但我找不到这样的东西。
有什么帮助吗?
可能还有其他方法可以做到这一点,但这里有一些是我想出的。第一个使用 match()
步骤:
gremlin> g.V().match(
......1> __.as('a').out('created').has('software','name','lop'),
......2> __.as('a').out('knows').has('person','name','josh')).
......3> select('a')
==>v[1]
第二个仅使用 and()
步骤:
gremlin> g.V().and(
......1> out('created').has('software','name','lop'),
......2> out('knows').has('person','name','vadas'))
==>v[1]
两者都可能需要对所有顶点进行全面扫描(不确定哪些图形数据库会优化这些遍历以使用索引),所以我也尝试了这个:
gremlin> g.V().has('person','name','vadas').in('knows').hasLabel('person').
......1> V().has('software','name','lop').in('created').hasLabel('person').
......2> path().
......3> filter(union(range(local,1,2),
......4> range(local,3,4)).
......5> fold().
......6> dedup(local).
......7> count(local).is(1)).
......8> tail(local)
==>v[1]
它基本上是抓取前两次遍历 V()
的 path()
,然后对其进行分析以寻找路径位置之间的匹配项。当我看到那个遍历时,我意识到它可以全部简化为:
gremlin> g.V().has('person','name','vadas').in('knows').hasLabel('person').as('a').
......1> V().has('software','name','lop').in('created').hasLabel('person').as('b').
......2> select('a').
......3> where('a',eq('b'))
==>v[1]
我正在使用 gremlin 控制台 v3.3.1。 使用教程中的 "Modern" 图: http://tinkerpop.apache.org/docs/current/tutorials/getting-started/
用这个创建图表:
gremlin>graph = TinkerFactory.createModern()
gremlin>g = graph.traversal()
我可以像这样找到所有认识 "vadas" 的人:
g.V().hasLabel('person').has('name', 'vadas').in('knows').hasLabel('person').valueMap()
我可以找到所有创建该软件 "lop" 的人:
g.V().hasLabel('software').has('name', 'lop').in('created').hasLabel('person').valueMap()
我可以找到所有知道 "vadas" 或通过合并操作创建 "lop" 的人:
g.V().union(
g.V().hasLabel('person').has('name', 'vadas').in('knows').hasLabel('person'),
g.V().hasLabel('software').has('name','lop').in('created').hasLabel('person')
).dedup().valueMap()
但我不知道如何找到所有知道 "vadas" 并创建 "lop" 的人。本质上我想要一个 INTERSECT 操作(我认为),但我找不到这样的东西。
有什么帮助吗?
可能还有其他方法可以做到这一点,但这里有一些是我想出的。第一个使用 match()
步骤:
gremlin> g.V().match(
......1> __.as('a').out('created').has('software','name','lop'),
......2> __.as('a').out('knows').has('person','name','josh')).
......3> select('a')
==>v[1]
第二个仅使用 and()
步骤:
gremlin> g.V().and(
......1> out('created').has('software','name','lop'),
......2> out('knows').has('person','name','vadas'))
==>v[1]
两者都可能需要对所有顶点进行全面扫描(不确定哪些图形数据库会优化这些遍历以使用索引),所以我也尝试了这个:
gremlin> g.V().has('person','name','vadas').in('knows').hasLabel('person').
......1> V().has('software','name','lop').in('created').hasLabel('person').
......2> path().
......3> filter(union(range(local,1,2),
......4> range(local,3,4)).
......5> fold().
......6> dedup(local).
......7> count(local).is(1)).
......8> tail(local)
==>v[1]
它基本上是抓取前两次遍历 V()
的 path()
,然后对其进行分析以寻找路径位置之间的匹配项。当我看到那个遍历时,我意识到它可以全部简化为:
gremlin> g.V().has('person','name','vadas').in('knows').hasLabel('person').as('a').
......1> V().has('software','name','lop').in('created').hasLabel('person').as('b').
......2> select('a').
......3> where('a',eq('b'))
==>v[1]