我无法找到一种在批量导入期间向节点添加标签的方法,我编写了一个将所有用户从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
答案 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