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)
そして、それは正常に動作し、約 147,000 の関係を返します。ただし、約 1,800 万の関係を返すはずの 2 つの異なるラベル (layer_1 から Layer_2) 間で同じクエリを作成すると、プログラムはしばらくロードされてから NULL を返します。Neo4j ブラウザで同じクエリを実行してカウントを返すと、機能するため、問題は R が処理できるデータ量に関係していると考えられます。
質問は:コードが機能するようにクエリをより小さなクエリに分割するにはどうすればよいですか?
アップデート1000万レルでクエリを実行してみましたが、うまくいきました。それで今使いたいのは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
解決
を使用する必要があります。 トランザクションエンドポイント 代わりに、または少なくともヘッダーを渡します X-Stream:true
.
どちらもサーバーからデータをストリーミングするため、メモリを消費しません。
所属していません StackOverflow