批量导入带标签的Neo4j独特节点

时间:2014-04-29 07:01:15

标签: batch-file import neo4j constraints unique

我无法找到一种在批量导入期间向节点添加标签的方法,我编写了一个将所有用户从mysql导出到neo4j的任务,我在userId上添加了一个约束。我修改了批处理以接受标签,它工作得非常好。现在,因为每个userId都是唯一的,批量导入工作正常,但我有另一个表作为技能,我在技能名称上添加了约束,对于多个用户,可能有类似的技能名称,现在因为技能名称不是唯一的,我的批量更新失败。我想知道是否有一种方法可以在批量导入中添加多项技能并对技能名称进行约束。我还想知道在批量导入期间是否有另一种添加标签的方法。

task :create_graph => :environment do
    people = []
    neo = Neography::Rest.new

    puts "Fetching Candidates"
    User.all.each do |user|
      begin
        people << { :userId => user.id, :firstName => user.first_name }
      rescue Exception => e
        puts e.message
      end
    end

    puts "Creating Candidate Nodes"
    people_nodes = {}
    people.each_slice(100) do |slice|
      commands = []
      slice.each_with_index do |person, index|
        commands << [:create_unique_node_with_label, "UserIndex", "userId", person[:userId], person]
      end
      label = ["CANDIDATE"]
      puts commands
      batch_results = neo.batch(label,*commands)
    end

  end

以下是我在gem中修改过的batch.rb文件中的修改代码。

def do_batch(label,*args)
        batch = []
        Array(args).each_with_index do |c, i|
          batch << {:id => i }.merge(get_batch(c))
          if c[0]==:create_unique_node_with_label
            batch << {:to => "{"+i.to_s+"}/labels",:body => label,:method => "POST"}
          end
        end
        options = {
          :body => batch.to_json,
          :headers => json_content_type
        }
        puts options
        @connection.post("/batch", options)
      end

def batch_create_unique_node_with_label(index, key, value, properties)
        post "/index/node/%{index}?unique" % {:index => index} do
          {
              :key        => key,
              :value      => value,
              :properties => properties
          }
        end
      end

1 个答案:

答案 0 :(得分:0)

您使用的唯一索引是Neo4j中的旧索引。我建议你看看Neo4j 2.0中新的唯一性约束,创建一个像

这样的约束
CREATE CONSTRAINT ON (n:Candidate) ASSERT n.name IS UNIQUE;

然后使用cypher MERGE功能对特殊事物进行get-or-create:

MERGE (n:Candidate {name:"some name"})
// And then do more things with n here

另外,您可以使用新的事务端点对这些cypher查询进行批处理:

http://docs.neo4j.org/chunked/stable/rest-api-transactional.html