格雷姆林,得到两个彼此有边的顶点

问题描述

因此,假设您有2000个人,他们可以选择喜欢在他们之间创造优势的某人,例如A喜欢B,但这并不一定意味着B喜欢A。我将如何编写一个gremlin查询来计算淘汰彼此相爱的人?那么A在哪里喜欢B,而B在哪里喜欢A?

我一直在浏览互联网,发现.both('likes'),但是据我了解,这将使每个喜欢某个人或拥有某个喜欢他们的人的人,不能同时出现。

我也找到了

g.V().hasId('1234567').as('y').
  out('likes').
  where(__.in('likes').as('y'))

这适用于1个人,但是我不知道如何使它适用于多人。

在我看来,这对于图形来说似乎是一个简单的问题,但是我似乎无法在线找到任何解决方案。从我阅读过的所有内容来看,似乎可以推断出数据的结构应该使得,如果A喜欢B,那也意味着B喜欢A。这是可以实现的,当创建A喜欢B的边时,可以检查是否B已经喜欢A,如果是这种情况,请插入一个特殊的边,例如... A inRelationshipwith B

对此的查询g.V().both('inRelationshipwith'),这会使事情变得更容易。

这是数据结构的问题吗?我可能错误地使用图形数据库吗?或者实际上是否有一种简单的方法来实现我想要的缺失?

解决方法

您几乎拥有了它。请记住,从另一个顶点开始,回到起始顶点的关系也是一个out关系。以下查询使用空中航线数据集来查找在两个方向都具有航线的所有机场(类似于您的相互友谊案例)

g.V().
   hasLabel('airport').as('a').
   out().as('b').
   where(out().as('a')).
   select('a','b').
     by('code')

这将返回一对关系。例如,它将包括每个机场(朋友)两次:

[a:DFW,b:AUS]
[a:AUS,b:DFW]

如果只希望每对中添加一个dedup步骤,则会将结果集减少为每个关系只有一对。

 g.V().
   hasLabel('airport').as('a').
   out().as('b').
   where(out().as('a')).
   select('a','b').
     by('code').
   order(local).
     by(values).
   dedup().
     by(values) 

查找相反的情况(没有相互关系)只是在查询中添加not步骤的一种情况。

g.V().
  hasLabel('airport').as('a').
   out().as('b').
   where(__.not(out().as('a'))).
   select('a','b').
     by('code')  
,

另一种可能的解决方案是:

g.V().as('y').
  out('likes').where(__.out('likes').as('y')).
  path().dedup().
    by(unfold().
      order().by(id).
      dedup().fold())

您可以在以下示例图上进行尝试: https://gremlify.com/radpwsh80o