如何保存neo4j数据库?

时间:2014-02-01 18:42:09

标签: 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文件时我都不想这样做(填充db)。我想填充数据一次,然后不想触摸数据库。之后我只想对它运行查询。任何人都可以告诉我如何填充并保存它?然后,无论何时我想使用它,我该如何加载它。谢谢。

4 个答案:

答案 0 :(得分:2)

听起来好像是并行运行这些请求或者不重用http连接。

您是否尝试@neo=Neography::Rest.new@neo.create_node({...})我认为可以重新使用http连接。

答案 1 :(得分:2)

创建一个@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

这里可以看到通过其余api加载数据的示例=&gt; https://github.com/maxdemarzi/neo_crunch/blob/master/neo_crunch.rb

这里可以看到使用队列进行写入的示例=&gt; http://maxdemarzi.com/2013/09/05/scaling-writes/

答案 2 :(得分:0)

您是在一次大型交易中运行整个导入吗?尝试将其拆分为10k节点的事务。但是,您仍然应该遇到“太多打开的文件”。如果你当时执行“lsof”(终端命令),你能看到哪些文件是打开的吗?

提交的数据会保留在neo4j数据库中。我认为导入失败并出现此错误并且没有任何内容保持导入,因为整个导入在一个大事务中运行。

答案 3 :(得分:0)

请记住,一旦写完所有内容,就可以备份Neo4j数据库。当需要很长时间来填充数据库并且您正在进行测试时,这很方便。只需复制/data/graph.db文件夹。