質問

そこで、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.

どちらもサーバーからデータをストリーミングするため、メモリを消費しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top