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
假设你有 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