Graph Gremlin,获取两个顶点,它们彼此都有一条边
假设你有2000人,他们可以选择喜欢某个人,这在他们之间创造了一种优势,例如A喜欢B,现在这并不一定意味着B喜欢A。我该如何编写一个小精灵查询来找出每个喜欢彼此的人?A喜欢B,B喜欢A 我在互联网上四处寻找,发现了Graph Gremlin,获取两个顶点,它们彼此都有一条边,graph,gremlin,amazon-neptune,Graph,Gremlin,Amazon Neptune,假设你有2000人,他们可以选择喜欢某个人,这在他们之间创造了一种优势,例如A喜欢B,现在这并不一定意味着B喜欢A。我该如何编写一个小精灵查询来找出每个喜欢彼此的人?A喜欢B,B喜欢A 我在互联网上四处寻找,发现了。两者都是('likes'),但据我所知,这会让每个喜欢某个人或拥有某个人的人都喜欢他们,而不是同时两者都喜欢 我也发现了这个 g.V().hasId('1234567').as('y'). out('likes'). where(__.in('likes').as('y'))
。两者都是('likes')
,但据我所知,这会让每个喜欢某个人或拥有某个人的人都喜欢他们,而不是同时两者都喜欢
我也发现了这个
g.V().hasId('1234567').as('y').
out('likes').
where(__.in('likes').as('y'))
这适用于一个人,但我不知道如何让它适用于多人
对我来说,这似乎是一个足够简单的图形问题,但我似乎找不到任何在线解决方案。从我读到的所有东西来看,似乎推断数据的结构应该是这样的,如果A喜欢B,这也意味着B喜欢A。这是可以实现的,当你创建A喜欢B的边时,你可以检查B是否已经喜欢A,如果是这样的话,插入一个特殊的边,就像。。。A与B的关系
对此的查询将是g.V()。两者('inRelationshipWith')
,这将使事情变得更简单
这是数据结构的问题吗?我可能会错误地使用图形数据库,还是有一种简单的方法可以实现我想要的东西,而我却缺少了它?你几乎做到了。记住,从另一个顶点返回到起始顶点的关系也是从该顶点的角度来看的
out
关系。下面的查询使用AirRoutes数据集查找在两个方向上都有路线的所有机场(类似于您的相互友谊案例)
这将返回成对的关系。它将包括每个机场(朋友)两次,例如:
[a:DFW,b:AUS]
[a:AUS,b:DFW]
如果只需要每对中的一对,则添加一个重复数据消除
步骤会将结果集减少为每对关系仅一对
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())
您可以在下面的示例图中进行尝试:
我在另一个选项卡上打开了你的书,我觉得我应该仔细阅读
g.V().as('y').
out('likes').where(__.out('likes').as('y')).
path().dedup().
by(unfold().
order().by(id).
dedup().fold())