Gremlin,得到两个彼此有边的顶点

Gremlin, get two vertices that both have an edge to each other

假设你有 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 关系。以下查询使用 air-routes 数据集来查找所有在两个方向都有航线的机场(类似于您的相互友谊案例)

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

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

[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