在询问有关 Gremlin 的问题时,包含创建示例图的脚本总是很有帮助的 - 例如:
g.addV('person').property('name','dave').as('d').
addV('person').property('name','rick').as('r').
addV('person').property('name','mavis').as('m').
addV('person').property('name','larry').as('l').
addV('course').property('name','english').as('e').
addV('course').property('name','history').as('h').
addV('grade').property('name','b').as('b').
addE('studies').from('d').to('e').
addE('studies').from('r').to('e').
addE('studies').from('m').to('h').
addE('studies').from('d').to('h').
addE('studies').from('r').to('h').
addE('isIn').from('l').to('b').
addE('isIn').from('d').to('b').iterate()
这是获得答案的一种相当直接的方法:
gremlin> g.V().has('person','name','dave').as('d').
......1> out('studies','isIn').
......2> in('studies','isIn').
......3> where(neq('d')).
......4> dedup().
......5> values('name')
==>mavis
==>rick
==>larry
首先找到“dave”,将该步骤标记为“d”,以便以后可以引用其内容,然后在要匹配的边缘上遍历out(),然后在相同的边缘上返回in()。此时,您又回到了与“dave”处于相同“等级”和“课程”的“person”顶点,但您想从输出中排除“dave”顶点,因此您使用 where() 步骤.如果“人”与“戴夫”共享多个“课程”或“成绩”,您可能会有重复,因此您必须dedup()。
这是基本算法,但您可以更高级。也许您想根据每个“人”与“戴夫”的共同点对这些“匹配项”进行排序:
gremlin> g.V().has('person','name','dave').as('d').
......1> out('studies','isIn').
......2> in('studies','isIn').
......3> where(neq('d')).
......4> groupCount().
......5> by('name').
......6> order(local).
......7> by(values, decr)
==>[rick:2,mavis:1,larry:1]
“rick”与“dave”有两个“匹配”(即共享“english”和“history”类),因此排名最高。请注意,在order() 步骤中使用local 很重要,因为它意味着在当前遍历器中进行排序(即名称/计数的Map) - 没有该指定,排序将应用于遍历流本身。