2013-03-18 25 views
3

我正在推薦引擎。收集用戶數據(他們的友誼,地點,喜歡,教育......),並已存儲在mongodb中。我需要向這些用戶推薦相關產品。我計劃將neo4j用於推薦引擎,原因很明顯(節點之間的遍歷方便,路徑信息等)。問題是我必須首先將mongodb數據轉換爲neo4j節點/關係,處理數據並將結果發送回mongodb數據庫。主要的問題是我們最終會維護兩個數據庫,開發團隊不會感到滿意。我已經看過類似的帖子mongodb-neo4jspring data,但不知道如何解決這個問題。 這些是我的問題
1-爲了推薦引擎(我們正在處理大型網絡),添加另一個數據庫是否值得,儘管neo4j非常適合這樣的任務。
2-我使用cypher進行查詢,對java,rest API和spring數據知之甚少。我應該使用什麼類型的mongodb-neo4j通信API?我目前的解決方案是使用R並將其用作連接到mongodb和neo4j的平臺。
3-其他圖形數據庫如何,是否有適合與Mongo集成的圖形數據庫?將mongodb與neo4j集成,是否有任何API將鏈接它們?

回答

4

我發現兩種方法結合的MongoDB和Neo4j的。第一個是由ryan1234使用Gremlin和Gmongo一起提出的。的步驟爲根據本優良blog
1-下載GmongoJava mongo driver
2-拷貝兩個jar文件的Neo4j/lib目錄
3-這是一個例子下以下。假設我們在MongoDB中有這個集合(稱爲跟隨)

{ "_id" : ObjectId("4ff74c4ae4b01be7d54cb2d3"), "followed" : "1", "followedBy" : "3", "createdAt" : ISODate("2013-01-01T20:36:26.804Z") } 
{ "_id" : ObjectId("4ff74c58e4b01be7d54cb2d4"), "followed" : "2", "followedBy" : "3", "createdAt" : ISODate("2013-01-15T20:36:40.211Z") } 
{ "_id" : ObjectId("4ff74d13e4b01be7d54cb2dd"), "followed" : "1", "followedBy" : "2", "createdAt" : ISODate("2013-01-07T20:39:47.283Z") } 

從Neo4j中的Gremlin shell運行以下命令。

import com.gmongo.GMongo 
mongo = new GMongo() 
db = mongo.getDB("local") 
db.follows.findOne().followed 
x=[] as Set; db.follows.find().each{x.add(it.followed); x.add(it.followedBy)} 
x.each{g.addVertex(it)} 
db.follows.find().each{g.addEdge(g.v(it.followedBy),g.v(it.followed),'follows',[followsTime:it.createdAt.getTime()])} 

,就是這樣我們已經創建的Neo4j相當於圖

+0

在你的代碼片段中,鏈接到neo4j的行實際上是缺失的,但是你使用了引用,加上'db.follows.findOne()。後面的'可以省略。 所以要得到這個片段的工作,你可以替換第4行 'g = new Neo4jGraph('/ tmp/neo4j')' – 2014-07-24 13:03:04

2

https://github.com/tinkerpop/gremlin/wiki

小鬼!

專門設計用於Neo4j /圖形數據庫。您也可以輕鬆下載GMongo並連接到Mongo。

退房在這篇文章中介紹瞭如何使用多種語言的數據交互小鬼:

http://thinkaurelius.com/2013/02/04/polyglot-persistence-and-query-with-gremlin/

+0

@ ryn,在你看來,是否有任何其他圖形數據庫更容易鏈接到mongo或neo4j是一個不錯的選擇?感謝您的評論,我會研究它。 – user1848018 2013-03-18 21:32:55

+0

我所知道的沒有任何東西會直接與Mongo集成。泰坦是Neo4j的替代品。 http://thinkaurelius.github.com/titan/如果您使用Gremlin,則不會直接將圖形數據庫連接到Mongo。相反,您將數據帶回到運行Gremlin的客戶端,然後在那裏處理數據。 Gremlin有一些本應該使圖遍歷更容易的語法。 – ryan1234 2013-03-18 23:06:16

0

,如果我們要使用R.下列R-代碼,將MongoDB中獲取數據有另一種解決方案

library(RMongo) 
library('bitops') 
library('RCurl') 
library('RJSONIO') 
mg <- mongoDbConnect("local", "127.0.0.1", 27017) 
mongoData <- dbGetQuery(mg, 'follows',"{}") 

其結果將是如下

followed followedBy     createdAt 
1  1   3 Tue Jan 01 15:36:26 EST 2013 
2  2   3 Tue Jan 15 15:36:40 EST 2013 
3  1   2 Mon Jan 07 15:39:47 EST 2013 

下述R代碼將CONNEC t到Neo4j並創建圖表。它是有效的,但它的工作原理

query <- function(querystring) { 
    h = basicTextGatherer() 
    curlPerform(url="http://localhost:7474/db/data/ext/CypherPlugin/graphdb/execute_query", 
    postfields=paste('query',curlEscape(querystring), sep='='), 
    writefunction = h$update, 
    verbose = TRUE 
) 

    result <- fromJSON(h$value()) 
    data <- data.frame(t(sapply(result$data, unlist))) 
    names(data) <- result$columns 
    data 

} 

nodes<-unique(c(mongoData$followed,mongoData$followedBy)) 
nodes=paste("_",nodes,sep="") 
nodes<-paste(paste("(",nodes,collapse="),"),")") 

edges<-apply(mongoData[,3:2],1,function(x) paste("_",x,sep="",collapse="-[:follows]->")) 
edges<-paste(edges,collapse=",")  

cmd<-paste(nodes,edges,sep=",") 
cmd=paste("create",cmd) 
query(cmd) 
0

你看看Reco4j?它使用neo4j作爲底層圖形數據庫。他們已經實施了幾個算法作爲項目的一部分。這裏是鏈接reco4j。該鏈接目前不可用,但我在訪問該網站時發現了這些功能。

1

爲了一起使用MongoDB和Neo4j,現在有Neo4j Doc Manager項目,它會自動將數據從MongoDB同步到Neo4j,將文檔轉換爲屬性圖結構。