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​​ 文件时都这样做(填充数据库)。我想填充一次数据,然后不想接触数据库。之后,我只想对其运行查询。谁能告诉我如何填充并保存它?然后如何在我想使用它的时候加载它。谢谢你。

4

4 回答 4

2

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

你有没有尝试过@neo=Neography::Rest.new@neo.create_node({...})我认为一个重用了 http 连接。

于 2014-02-02T23:04:36.037 回答
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/

于 2014-02-03T04:15:34.297 回答
0

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

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

于 2014-02-02T20:49:49.067 回答
0

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

于 2014-02-22T06:10:16.520 回答