所以我尝试使用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进行查询并且它有效。所以现在我想使用WITH
和ORDER 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