Graph Gremlin,查找具有相似关系的顶点

Graph Gremlin,查找具有相似关系的顶点,graph,neo4j,gremlin,Graph,Neo4j,Gremlin,我在寻找一些小精灵,对于一个给定的顶点,它们会找到其他具有相同或相似关系的顶点 例如,想象一幅人物图,这些人物与其他实体(如科目和年级)有关系。比如说我选了一个人,就叫他们戴夫。他与英语和历史相关,成绩为B级 Dave -STUDIES-> English Dave -STUDIES-> History Dave -IS_IN -> B 如何找到其他人谁分享这些关系使用小精灵 我已经到了 g.V('Dave').out() 找到与Dave有关的一切 我怎样才能用这个来找到

我在寻找一些小精灵,对于一个给定的顶点,它们会找到其他具有相同或相似关系的顶点

例如,想象一幅人物图,这些人物与其他实体(如科目和年级)有关系。比如说我选了一个人,就叫他们戴夫。他与英语和历史相关,成绩为B级

Dave -STUDIES-> English
Dave -STUDIES-> History 
Dave -IS_IN -> B
如何找到其他人谁分享这些关系使用小精灵

我已经到了

g.V('Dave').out()
找到与Dave有关的一切

我怎样才能用这个来找到与Dave有着相同或部分关系的其他人

(我已经在neo4j中完成了这项工作,而且非常简单

match ((p1:Person{name:'Dave'})-[r]->(n)),((p2:Person)-[s]->(n)) 
return distinct p1.name,p2.name, count(p2.name)
order by count(p2.name) desc
)


谢谢

当询问有关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()
步骤。如果“个人”与“dave”共享多个“课程”或“成绩”,则可能会有重复项,因此必须
dedup()

这是基本的算法,但你可以更高级。也许您想根据每个“人”与“戴夫”的共同点的数量对这些“匹配项”进行排序:


“rick”与“dave”有两个“匹配”(即共享“英语”和“历史”课程),因此排名最高。请注意,在
order()
步骤中使用
local
非常重要,因为它意味着在当前遍历器中进行排序(即名称/计数的
Map
)——如果没有该指定,排序将应用于遍历流本身中的对象

当询问有关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()
步骤。如果“个人”与“dave”共享多个“课程”或“成绩”,则可能会有重复项,因此必须
dedup()

这是基本的算法,但你可以更高级。也许您想根据每个“人”与“戴夫”的共同点的数量对这些“匹配项”进行排序:

“rick”与“dave”有两个“匹配”(即共享“英语”和“历史”课程),因此排名最高。请注意,在
order()
步骤中使用
local
非常重要,因为它意味着在当前遍历器中进行排序(即名称/计数的
Map
)——如果没有该指定,排序将应用于遍历流本身中的对象