3

我正在研究推荐引擎。收集用户数据(他们的友谊、位置、喜欢、教育......)并且已经存储在 mongodb 中。我需要向这些用户推荐相关产品。出于显而易见的原因(节点之间的轻松遍历、路径信息……),我计划将 neo4j 用于推荐引擎。问题是我必须首先将 mongodb 数据转换为 neo4j 节点/关系,处理数据并将结果发送回 mongodb 数据库。主要问题是我们最终会维护两个数据库,这让开发团队很不高兴。我已经查看了类似的帖子mongodb-neo4jspring data但不确定如何解决这个问题。这些是我的问题
1- 仅仅为了推荐引擎(我们正在处理一个大型网络)而添加另一个数据库是否值得,尽管 neo4j 非常适合此类任务。
2-我使用密码进行查询,对java、rest API和spring数据了解不多。我应该使用哪种 API 进行 mongodb-neo4j 通信?我目前的解决方案是使用 R 并将其用作连接 mongodb 和 neo4j 的平台。
3-其他图形数据库怎么样,有没有适合与Mongo集成的?

4

5 回答 5

4

我找到了两种集成 mongodb 和 Neo4j 的方法。第一个是ryan1234使用 Gremlin 和 Gmongo 提出的。根据这篇优秀的博客,步骤如下
1- 下载GmongoJava mongo 驱动程序
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中创建了等效图

于 2013-03-19T20:15:50.603 回答
2

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

小鬼!

专门设计用于 Neo4j/graph 数据库。您也可以轻松下载 GMongo 并连接到 Mongo。

查看这篇描述如何在 Gremlin 中与多语言数据交互的文章:

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

于 2013-03-18T19:15:02.307 回答
1

为了同时使用 MongoDB 和 Neo4j,现在有Neo4j Doc Manager项目,它将自动将数据从 MongoDB 同步到 Neo4j,将文档转换为属性图结构。

于 2015-10-29T23:27:02.763 回答
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)
于 2013-03-19T20:25:37.460 回答
0

你看过Reco4j吗?它使用 neo4j 作为底层图形数据库。作为项目的一部分,他们实施了一些算法。这是链接reco4j。该链接目前不可用,但我在访问该站点时发现这些功能很好。

于 2014-02-17T11:54:27.453 回答