Rest 访问自动索引时的不一致性

Rest 访问自动索引时的不一致性,rest,indexing,neo4j,Rest,Indexing,Neo4j,我一直在玩Neo4j自动索引,我很困惑 我使用的是: neo4j-community-1.8.M05 卢比1.9.3p194 以下代码也位于 我的目的是创建具有唯一“uuid”值(由我生成)的节点。为了确保它们是唯一的,我的想法是对照索引进行检查,如果uuid值已经存在,那么我将生成一个新的uuid值 我看到的是,对于我的一个UUID('blahblahuuid')来说,这是可行的,但对于另一个UUID来说,它不是。。。我也不知道为什么(查看Neo4j监控工具控制台) 如果您在ruby1.9

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

我使用的是:

  • neo4j-community-1.8.M05
  • 卢比1.9.3p194
以下代码也位于

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

我看到的是,对于我的一个UUID('blahblahuuid')来说,这是可行的,但对于另一个UUID来说,它不是。。。我也不知道为什么(查看Neo4j监控工具控制台)

如果您在ruby1.9.3上干净地安装neo4j时尝试下面的代码(不更改属性等),那么希望您能看到我看到的行为

这是我的密码:

档案:

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_属性(“uuid”)

正如Max指出的,我的uuid中有一个“/”

正如罗素·杜洪所指出的那样(https://groups.google.com/forum/?fromgroups#!topic/neo4j/KyW0s5p5 fM)

我应该使用一个uuid库——这就是我现在正在做的(使用uuid gem)——然后我就不必检查是否存在相同的uuid——因为uuid应该是唯一的

我还对通过neography传递的所有参数进行编码,因为其中一些参数可能包含斜杠和“?&=”符号,这可能会干扰其余url

谢谢Max和Russell的帮助

它正在做:

existing_node_with_uuid = $neo.get_node_auto_index('uuid', '7sZfZnCgz4sL/TkE4tPqb5+GgF0=')
正在将get请求发送到:

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

我认为“/”把事情搞得一团糟。

为Max干杯-我会确保去掉斜杠和问号。我想知道neo4j的RESTAPI是否对URI参数进行了编码?在进行api调用之前,在neography中这样编码URI参数有意义吗?我可以想象,随着时间的推移,其他人会被这个问题绊倒——它可能是注射型攻击的来源。谢谢你的帮助,我很感激!!看起来neo4j在存储uri参数之前不会对其进行取消编码还有一件事-你知道为什么我的代码似乎没有自动建立索引吗?我还没有解决这个问题-我修改了neo4j.properties,使node_auto_index=true和node_keys_index=uuid,但是上面的代码(使用CGI URI编码来解决“/”问题)继续使用相同的uuid生成节点…不用担心-我需要添加$neo。添加node_auto_index_属性(“uuid”)-查看neography规范帮助:)