2012-07-18 79 views
1

我一直在Neo4j的自動索引玩弄,我很困惑...不一致的訪問自動索引

我正在使用:

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

下面的代碼也處於https://github.com/LouisSayers/Neo4jChallenges

我的目的是創建具有唯一'uuid'值(由我生成)的節點。爲了確保它們是唯一的,我的想法是檢查索引,如果uuid值已經存在,那麼我會生成一個新的uuid值。

我看到的是,對於我的一個uuids('blahblahuu')這個工作,但對於其他它不......我不知道爲什麼(檢查Neo4j監測工具控制檯)。

如果您在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; 
#UPDATE

我想通了什麼事情錯了 - 首先,我沒有指標UUID正確,我需要添加: $ neo.add_node_auto_index_property(的 「uuid」)

和馬克斯指出,我在我的uuid中有一個'/'。

另外,作爲由拉塞爾 - 杜洪(https://groups.google.com/forum/?fromgroups#!topic/neo4j/KyW0s5p5-fM)指出

我剛纔使用的UUID庫 - 這是我現在正在做的(使用uuid gem - https://github.com/assaf/uuid/),然後避免檢查是否存在相同的uuid - 因爲uuid應該是唯一的。

我也編碼了我​​通過neography傳遞的所有參數 - 因爲有可能它們中的一些可能包含斜槓,而'? '& ='可能會干擾其他網址的符號!

謝謝Max和Russell的幫助!

回答

2

它是這樣做的:

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= 

我認爲 「/」 正在亂七八糟的東西。

+0

乾杯最大 - 我會確保我擺脫斜線和問號。 我不知道neo4j的REST API是否解開了URI參數的編碼? 在進行api調用之前,在neography中如何編碼URI參數是否合理?我可以想象隨着時間的推移,其他人可能會絆倒它 - 這可能是注入式攻擊的來源。 感謝您的幫助,我欣賞它! – 2012-07-19 10:45:25

+0

看起來像neo4j不會在存儲它們之前解碼uri參數 – 2012-07-19 11:29:23

+0

還有一件事 - 你知道我的代碼爲什麼沒有拿起自動索引嗎?我還沒有制定出來 - 我改性neo4j.properties,有 node_auto_indexing =真 和 node_keys_indexable = UUID 但上面的代碼(具有CGI URI編碼修復「/」問題)。室內產生節點與相同的uuid ... – 2012-07-19 11:36:39