ruby - 如何保存neo4j数据库?

标签 ruby csv neo4j neography

我是第一次使用 neo4j,Ruby 的 neography。我的数据在 csv 文件中。我可以通过我的主文件成功填充数据库,即创建所有节点。所以,对于每个 csv 文件(这里是 user.csv),我正在做 -

def create_person(name, id)
  Neography::Node.create("name" => name, "id" => id)
end

CSV.foreach('user.csv', :headers => true) do |row|
  id = row[0].to_i()
  name = row[1]
  $persons[id] = create_person(name, id)
end

其他文件也是如此。现在有两个问题。首先,如果我的文件很小,那么一切正常,但是当文件稍大时,我会得到(我正在处理 4 个 1MB 的文件)-

SocketError: Too many open files (http://localhost:7474)

另一个问题是我不想在每次运行此 ruby​​ 文件时都执行此操作(填充数据库)。我想填充一次数据,然后不想触及数据库。之后我只想对其运行查询。谁能告诉我如何填充和保存它?然后我想使用它时如何加载它。谢谢。

最佳答案

创建@neo 客户端:

  @neo = Neography::Rest.new

创建队列:

  @queue = []

使用 BATCH api 进行数据加载。

def create_person(name, id)
  @queue << [:create_node, {"name" => name, "id" => id}]
  if @queue.size >= 500
    batch_results = neo.batch *@queue
    @queue = []
    batch_results.each do |result|
      id = result["body"]["self"].split('/').last
      $persons[id] = result
    end
  end
end

运行你的 csv 文件:

CSV.foreach('user.csv', :headers => true) do |row|
  create_person(row[1], row[0].to_i)
end

获取剩菜:

    batch_results = @neo.batch *@queue
    batch_results.each do |result|
      id = result["body"]["self"].split('/').last
      $persons[id] = result
    end

可以在这里看到通过 rest api 加载数据的示例 => https://github.com/maxdemarzi/neo_crunch/blob/master/neo_crunch.rb

可以在此处看到使用队列进行写入的示例 => http://maxdemarzi.com/2013/09/05/scaling-writes/

关于ruby - 如何保存neo4j数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501999/

相关文章:

java - Servlet 中的 Neo4j 数据库

mysql - NoSQL 或 Ehcache 缓存?

java - 设置 Neo4j 缓存

ruby - Sinatra session 自动销毁

csv - 在 WSO2 Integration Studio 中读取 .txt 文件

python - 提前比较两个或多个 csv 文件

python - 将 CSV 的唯一第 0 个元素分组为 python 或 hive 中唯一的第 i 个元素

ruby - 如何在 Vagrant 中使用本地环境变量?

ruby - 在 Ruby 的 define_method 中使用 yield

javascript - 文件上传无照片参数问题