小鬼交叉操作

cri*_*rig 2 gremlin tinkerpop tinkerpop3

我正在使用 gremlin 控制台 v3.3.1。使用教程中的“现代”图:http : //tinkerpop.apache.org/docs/current/tutorials/getting-started/

用这个创建图形:

gremlin>graph = TinkerFactory.createModern()
gremlin>g = graph.traversal()
Run Code Online (Sandbox Code Playgroud)

我可以找到所有像这样知道“vadas”的人:

g.V().hasLabel('person').has('name', 'vadas').in('knows').hasLabel('person').valueMap()
Run Code Online (Sandbox Code Playgroud)

我可以找到所有创建“lop”软件的人:

g.V().hasLabel('software').has('name', 'lop').in('created').hasLabel('person').valueMap()
Run Code Online (Sandbox Code Playgroud)

我可以找到所有知道“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()
Run Code Online (Sandbox Code Playgroud)

但我不知道如何找到所有知道“vadas”并创建“lop”的人。基本上我想要一个 INTERSECT 操作(我认为),但是我找不到这样的东西。

有什么帮助吗?

ste*_*tte 9

可能还有其他方法可以做到这一点,但这里有一些我想出的方法。第一个使用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]
Run Code Online (Sandbox Code Playgroud)

第二个只是使用and()步骤:

gremlin> g.V().and(
......1>   out('created').has('software','name','lop'),
......2>   out('knows').has('person','name','vadas'))
==>v[1]
Run Code Online (Sandbox Code Playgroud)

两者都可能需要对所有顶点进行全面扫描(不确定哪些图形数据库会优化这些遍历以使用索引),所以我也试过这个:

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]
Run Code Online (Sandbox Code Playgroud)

它基本上抓取path()前两次遍历的V(),然后对其进行分析以查找路径位置之间的匹配项。当我看到那个遍历时,我意识到它可以简化为:

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]
Run Code Online (Sandbox Code Playgroud)