【问题标题】:Gremlin, find vertices with similar relationshipsGremlin,找到具有相似关系的顶点
【发布时间】:2018-04-04 17:41:42
【问题描述】:

我在收集一些 gremlin 之后,对于给定的顶点,它会找到具有相同或相似关系的其他顶点。

例如,想象一个 Person 图表,这些 Person 与其他实体(如科目和年级)有关系。假设我选择了一个人,我们称他们为 Dave。他与英语和历史相关,是B级。

Dave -STUDIES-> English
Dave -STUDIES-> History 
Dave -IS_IN -> B

如何使用 Gremlin 找到共享这些关系的其他人?

我已经做到了

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

)

谢谢!

【问题讨论】:

    标签: graph neo4j gremlin


    【解决方案1】:

    在询问有关 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) - 没有该指定,排序将应用于遍历流本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多