将Neo4j Cypher分解为较小的查询

时间:2014-07-29 15:30:07

标签: r neo4j cypher

所以我尝试使用R

从我的Neo4j数据库中提取一些数据到文件

这就是代码的样子:

library('bitops')
library('RCurl')
library('RJSONIO')

query <- function(querystring) {
  h = basicTextGatherer()
  curlPerform(url="localhost:7474/db/data/cypher",
    postfields=paste('query',curlEscape(querystring), sep='='),
    writefunction = h$update,
    verbose = FALSE
  )           
  result <- fromJSON(h$value())
  #print(result)
  data <- data.frame(t(sapply(result$data, unlist)))
  print(data)
  names(data) <- result$columns
  data

}

q <-"MATCH (n:`layer_1_SB`)-[r]-> (m) WHERE m:layer_1_SB RETURN n.userid, m.userid LIMIT 18000000"
 data <- query(q)
 head(data)
 dim(data)
 names(data)
 write.table(data, file = "/home/dataminer/data1.dat", append=FALSE,quote=FALSE,sep=" ",eol="\n", na="NA", dec=".", row.names=FALSE)

它工作正常,返回约147k的关系。但是,当我在两个不同的标签(layer_1到layer_2)之间进行相同的查询时,它应该返回大约1800万个关系,程序加载一段时间然后返回NULL。当进行相同的查询并在Neo4j浏览器上返回计数时,它可以工作,所以我假设问题与R可以处理的数据量有关。

问题是:如何将查询拆分为较小的查询,以便我的代码可以正常工作?

更新 我尝试用1000万个rels进行查询并且它有效。所以现在我想使用WITHORDER BY来返回第一个和最后一个关系。但是,它返回NULL,我相信我的查询格式错误:

MATCH (n:'layer_1_SB')-[r]-> (m) WITH n ORDER BY n.userid DESC WHERE m:layer_2_SB RETURN n.userid, m.userid LIMIT 8000000

1 个答案:

答案 0 :(得分:2)

您应该使用transactional endpoint代替或至少传递标题X-Stream:true

两者都来自服务器的流数据,因此它不会耗尽其内存。