2015-12-03 30 views
0

儘管Freebase已於2015年6月棄用,但我留下了深刻的印象Freebase's MQL。它直觀,簡潔,具有說明性,易於理解/編寫。將Freebase MQL轉換爲TinkerPop3 gremlin?

這些天我正在學習TinkerPop3和gremlin。我認爲gremlin有很多好的功能。我想知道我是否可以將Freebase MQL轉換爲TinkerPop3 gremlin。

比方說,我有TinkerPop3樣本數據"The Crew"及以下MQL:

[{ 
    "type": "person", 
    "name": null, 
    "develops": { 
     "type": "software", 
     "release_date": null, // release_date is not in the crew data. 
           // Just added for test 
     "name": null, 
     "sort": "-name",  // descending sort 
     "limit": 2   // print only two software 
    }, 
    "uses": { 
     "type": "software", 
     "release_date": null, 
     "name": null, 
     "sort": "name",  // ascending sort 
     "limit": 2 
    } 
}] 

以上MQL的意思是「找人」,併爲每個人「打印他的兩個開發的軟件和使用軟件」。請記住,上面的MQL只是測試的一個例子。

我試着將MQL轉換爲單個gremlin。但我無法將其轉換。所以我問你。可能嗎?那麼如何轉換,如果不可能,爲什麼? (如果可能的話,如果生成的gremlin在優化和執行方面效率會更好)。

如果單個gremlin是不可能的,那麼是否有可能組裝兩個或更多gremlin可以生成與MQL的輸出相同性能損失?

謝謝先進。

回答

3

最快的查詢來解決這個問題應該是以下幾點:

gremlin> g.V().hasLabel("person").as("person"). 
gremlin> map(out("develops").order().by("name", decr).limit(2).fold()).as("develops").select("person"). 
gremlin> map(out("uses").order().by("name", incr).limit(2).fold()).as("uses"). 
gremlin> select("person","develops","uses") 
==>[person:v[1], develops:[v[11], v[10]], uses:[v[10], v[11]]] 
==>[person:v[7], develops:[v[11], v[10]], uses:[v[10], v[11]]] 
==>[person:v[8], develops:[v[10]], uses:[v[10], v[11]]] 
==>[person:v[9], develops:[], uses:[v[10], v[11]]] 

但是,使用match()一步,你可能可以增強可讀性(雖然它包含了相同的步驟):

g.V().hasLabel("person").match(
    __.as("person").out("develops").order().by("name", decr).limit(2).fold().as("develops"), 
    __.as("person").out("uses").order().by("name", incr).limit(2).fold().as("uses")). 
    select("person","develops","uses") 

UPDATE

既然你不想見我(v[9])在日e結果集,您可以添加一個簡單的過濾條件:

g.V().hasLabel("person").as("person"). 
    filter(outE("develops").and().outE("uses")). 
    map(out("develops").order().by("name", decr).limit(2).fold()).as("develops").select("person"). 
    map(out("uses").order().by("name", incr).limit(2).fold()).as("uses"). 
    select("person","develops","uses") 
+0

謝謝你有時間。 儘管你的gremlin和MQL一樣工作(頂點9(YOU!)沒有'develop'邊緣,所以v [9]不應該被打印出來) ,map/fold方法很有幫助。非常感謝。 –

+0

你能否回答[這個問題](http://stackoverflow.com/questions/34285006/index-does-not-work-when-using-order-by-in-titan)?如果可以的話,我真的很感激。 –