如何保存Neo4j数据库?

5

我是第一次使用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文件时都执行这个操作(填充数据库)。我想仅仅填充一次数据,然后不再触碰数据库。之后我只想对它运行查询。请问有人可以告诉我如何填充并保存它吗?然后当我需要使用它时如何加载它。谢谢。


您已经使用了所有的文件描述符,无法再打开更多文件。 - Малъ Скрылевъ
@МалъСкрылевъ 但是在打开每个CSV文件后,我执行了 end,这不会关闭文件吗? - theharshest
4个回答

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

通过rest api进行数据加载的示例可以在此处查看 => https://github.com/maxdemarzi/neo_crunch/blob/master/neo_crunch.rb

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


2

看起来你是并行运行这些请求或者没有重用http连接。

你试过使用 @neo=Neography::Rest.new@neo.create_node({...}) 吗?我认为这个方法可以重用http连接。


0

记得在你完成所有编写后备份你的Neo4j数据库。这在填充数据库需要很长时间并且你正在进行测试时非常方便。只需复制/data/graph.db文件夹即可。


0

你是在一个大事务中运行整个导入过程吗?尝试将其拆分为每个事务处理10k个节点。但是,你仍然不应该遇到“打开文件太多”的问题。如果你在那时运行“lsof”(终端命令),你能看到哪些文件是打开的吗?

已提交的数据会持久保存在neo4j数据库中。我认为导入失败并且没有任何内容被导入,因为整个导入过程在一个大事务中运行。


谢谢回复。我正在像这样做 https://gist.github.com/theharshest/8774747 如何提交数据? - theharshest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接