2012-05-21 28 views
2

假設一個網絡有兩種節點,稱爲用戶和地點,關係「已進入」。這是一個雙向網絡,從它通常一個模塊(如networkx)可以在兩個方向中的任何一個方向上提供網絡的「投影」,這樣我們就可以生成地點網絡(鏈接的重量等於普通用戶的數量)或用戶網絡(鏈接的重量爲常用地點的數量)。圖DB等價於雙向網絡投影?

我該如何在Graph數據庫中生成這樣的網絡?你可以提供最常見的開放源代碼的例子,說OrientDB,Neo4j,FlockDB ...

更具體地說,如何用gremlin做到這一點?在這種情況下(gremlin),我自己貼了一個答案,但它從倖存的節點開始,從要投影的節點開始會更有效率,因爲通常第一步是一些間隔部分選定

g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}.... 

讓我們只用戶的網絡誰是已經在同一個地方某一天,或者一些其它的間隔相關的興趣。

+0

您是否使用'oetl.sh'批量加載程序加載了二分圖?如果是的話,你會不會分享如何? – tipanverella

回答

1

我可以建議Marko Rodriguez's blog,因爲它包含許多關於此用例的示例。 Marko也是Gremlin的作者,OrientDB和Neo4J都符合它。

+0

感謝指針,這個博客非常有趣,Marko在ArXiV中的工作更多! – arivero

0

從投影節點開始,我發現在小鬼 (此外,它工作在OrientDB REST接口)

g.V.filter{it.type=='user'}.as('a').out('checkedIn_at').in('checkedIn_at') 
.as('b').simplePath.select(['a','b']).groupCount(){it.name}.cap() 

一個方式,因爲它是一個答案,我的自我回答我:-D

在某些情況下,您有一個龐大的數據庫,其中圖是一個子選擇。我寧願再從東西開始一個答案,

g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}.... 

在這裏,我的猜測是

...sideEffect{x=it}.in.as('a').transform{x}.in.as('b').select(['a','b']) 
.groupCount(){it.name}.cap() 

現存的問題是,這些模式不允許任意投影功能。一種解決方案,我想,可能是要列出通用頂點每對用戶來說,與GROUPBY的多功能性發揮:

g.V.filter{it.type=='place'}.sideEffect{x=it}.out.as('a').transform{x}.out 
.as('b').select(['a','b']).groupBy{[it[0],it[1]]}{x}.cap 

GROUPBY,與後處理的第三個參數,允許大量的MapReduce圖案。

+0

順便說一句,我對我表達的長度不是很滿意,他們很容易變成多線。我猜想我缺少一些語法糖。 – arivero