我正在研究推荐引擎。收集用户数据(他们的友谊,地点,喜欢,教育......)并且已经存储在mongodb中。我需要向这些用户推荐相关产品。我打算使用neo4j作为推荐引擎,原因很明显(节点之间的遍历容易,路径信息......)。问题是我必须先将mongodb数据转换为neo4j节点/关系,处理数据并将结果发送回mongodb数据库。主要问题是我们最终会维护两个数据库,这是开发团队不满意的。我已经查看了类似的帖子mongodb-neo4j和spring data,但不确定如何解决这个问题。
这些是我的问题
1-仅仅为了推荐引擎(我们正在处理大型网络)而添加另一个数据库是值得的,尽管neo4j非常适合这样的任务。
2-我使用cypher进行查询,对Java,rest API和spring数据不太了解。我应该使用哪种API进行mongodb-neo4j通信?我目前的解决方案是使用R并将其用作连接mongodb和neo4j的平台
3-其他图形数据库如何,是否适合与Mongo集成?
答案 0 :(得分:4)
我找到了两种集成mongodb和Neo4j的方法。第一个是ryan1234使用Gremlin和Gmongo建议的。根据这个优秀blog的步骤如下
1-下载Gmongo和Java mongo driver
2-复制neo4j / lib目录下的两个jar文件
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中创建了等效图
答案 1 :(得分:2)
https://github.com/tinkerpop/gremlin/wiki
的Gremlin!
专门设计用于Neo4j /图形数据库。您也可以轻松下载GMongo并连接到Mongo。
查看本文介绍如何与Gremlin中的多语言数据进行交互:
http://thinkaurelius.com/2013/02/04/polyglot-persistence-and-query-with-gremlin/
答案 2 :(得分:1)
为了一起使用MongoDB和Neo4j,现在有Neo4j Doc Manager项目,它将自动将MongoDB中的数据同步到Neo4j,将文档转换为属性图结构。
答案 3 :(得分: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代码将连接到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)
答案 4 :(得分:0)
您是否看过 Reco4j ?它使用neo4j作为底层图形数据库。作为项目的一部分,他们实施了很少的算法。这是链接reco4j。该链接目前无法使用,但我在访问该网站时发现这些功能很好。