访问自动索引的不一致

时间:2012-07-18 22:16:34

标签: rest indexing neo4j

我一直在玩Neo4j自动索引,我很困惑......

我正在使用的是什么:

  • 的Neo4j-社区1.8.M05
  • ruby​​1.9.3p194

以下代码也位于https://github.com/LouisSayers/Neo4jChallenges

我的目的是创建具有唯一'uuid'值的节点(由我生成)。为了确保它们是唯一的,我的想法是检查索引,如果uuid值已经存在,那么我将生成一个新的uuid值。

我看到的是,对于我的一个uuids('blahblahuuid')这个有效,但对于另一个它没有...我不知道为什么(检查Neo4j监视工具控制台)。< / p>

如果你在ruby1.9.3上彻底安装neo4j时尝试下面的代码(没有更改属性等),那么希望你能看到我所看到的行为!

这是我的代码:

的Gemfile:

source "http://rubygems.org"
source "http://gems.rubyforge.org"
source "http://gemcutter.org"

#gem install bundler -v 1.2.0.pre --pre

ruby '1.9.3'
gem 'bundler', '1.2.0.pre'
gem 'neography', :git => 'https://github.com/maxdemarzi/neography'

test.rb:

require "rubygems"
require "bundler"
require 'digest/sha1'
require 'securerandom'
Bundler.setup(:default)

require 'neography'

$neo = Neography::Rest.new("http://localhost:7474")
$neo.create_node_index("node_auto_index")
$neo.set_node_auto_index_status(true)

$neo.execute_script("g.clear()")

def generate_uuid(deviceUUID)
  uuid = Digest::SHA1.base64digest deviceUUID
  existing_node_with_uuid = $neo.get_node_auto_index('uuid', uuid)

  until existing_node_with_uuid.nil?
    uuid = Digest::SHA1.base64digest (deviceUUID.to_s + SecureRandom.base64(8))
    existing_node_with_uuid = $neo.get_node_auto_index('uuid', uuid)
  end
  uuid
end


def generate_node(deviceUUID)
  uuid = generate_uuid(deviceUUID)
  secret = SecureRandom.base64(256)
  currentTime = DateTime.now

  $neo.create_node("uuid" => uuid, "deviceUUID" => deviceUUID,
                   "secret" => secret, "currentTime" => currentTime)
end

generate_node('blahblahuuid')
generate_node('blahblahuuid')
generate_node('4edb096b479588f6')
generate_node('4edb096b479588f6')

运行代码:

ruby test.rb

在neo4j控制台中列出结果:

start all = node(*)
return all;
#更新

我弄清楚出了什么问题 - 首先我没有正确索引uuid,我需要添加: $ neo.add_node_auto_index_property(的 “uuid”)

正如Max指出的那样,我的uuid中有一个'/'。

另外正如Russell Duhon所指出的那样(https://groups.google.com/forum/?fromgroups#!topic/neo4j/KyW0s5p5-fM)

我应该刚刚使用了一个uuid库 - 这就是我现在正在做的事情(使用uuid gem - https://github.com/assaf/uuid/)然后我避免检查是否存在相同的uuid - 因为uuid应该是唯一的。

我也编码了我​​通过neography传递的所有参数 - 因为它们中的某些参数可能包含斜杠,而'?&amp; ='符号可能会干扰其余网址!

感谢Max和Russell的帮助!

1 个答案:

答案 0 :(得分:2)

它正在做:

existing_node_with_uuid = $neo.get_node_auto_index('uuid', '7sZfZnCgz4sL/TkE4tPqb5+GgF0=')

将发送请求发送到:

/db/data/index/node/node_auto_index/uuid/7sZfZnCgz4sL/TkE4tPqb5+GgF0=

我认为“/”会弄得一团糟。