簡體   English   中英

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

對此的查詢將是gV().both('inRelationshipWith')這將使事情變得更容易。

這是數據結構的問題嗎,我可能錯誤地使用了圖形數據庫,還是實際上有一種簡單的方法可以實現我想要的但我缺少的東西?

你幾乎擁有它。 請記住,從另一個頂點返回到起始頂點的關系也是從該頂點的角度來看的out關系。 以下查詢使用 air-routes 數據集查找所有在兩個方向都有航線的機場(類似於您的相互友誼案例)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM