2016-04-21 44 views
1

我有一個遍歷如下:提供的開始沒有映射到一個值

g.V().hasLabel("demoUser") 
.as("demoUser","socialProfile","followCount","requestCount") 
.select("demoUser","socialProfile","followCount","postCount") 
.by(__.valueMap()) 
.by(__.out("socialProfileOf").valueMap()) 
.by(__.in("followRequest").hasId(currentUserId).count()) 
.by(__.outE("postAuthorOf").count()) 

我想選擇一個用戶頂點,他們的聯繫社會知名度頂點,以及其他一些罪名。問題是所有用戶可能沒有socialProfile邊緣。如果是這種情況下,穿越失敗,出現以下錯誤:

The provided start does not map to a value: v[8280]->[TitanVertexStep(OUT,[socialProfileOf],vertex), PropertyMapStep(value)]

我發現從小鬼隊this thread。我嘗試用coalesce()包裝.by()的內部邏輯,並且在聲明的末尾附加.fold(),但沒有運氣。

如何使該選擇成爲可選項?我想選擇一個socialProfile(如果存在),但始終選擇demoUser

回答

4

​​3210是正確的選擇。讓我們假設,在現代圖形的人有一個或沒有與之相關的項目:

gremlin> g.V().hasLabel("person").as("user","project"). 
      select("user","project").by("name").by(coalesce(out("created").values("name"), 
                  constant("N/A"))) 
==>{user=marko, project=lop} 
==>{user=vadas, project=N/A} 
==>{user=josh, project=ripple} 
==>{user=peter, project=lop} 

另一種方法是從結果完全排除:

g.V().hasLabel("person").as("user","project").choose(out("created"), 
    select("user","project").by("name").by(out("created").values("name")), 
    select("user").by("name")) 

但很明顯這隻會看如果每個分支都返回一張地圖/選擇多於一個的東西,那麼很好,否則你會有混合的結果類型。

+0

'coalesce'完美運作。 – Fook

相關問題