私はNeo4jの自動インデックス作成をいじっていますが、かなり混乱しています...
私が使用しているもの:
- neo4j-community-1.8.M05
- ruby1.9.3p194
次のコードもhttps://github.com/LouisSayers/Neo4jChallengesにあります
私の意図は、(私が生成した)一意の「uuid」値を持つノードを作成することです。それらが一意であることを確認するために、私の考えはインデックスと照合することでした。uuid値がすでに存在する場合は、新しいuuid値を生成します。
私が見ているのは、私のuuid('blahblahuuid')の1つではこれが機能するが、他のuuidでは機能しないということです...そして理由はわかりません(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;
# アップデート
何が問題になっているのかを理解しました。最初に、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は一意である必要があります。
また、ネオグラフィーを通過するすべてのパラメーターをエンコードしています。一部のパラメーターにはスラッシュと、残りのURLに干渉する可能性のある「?&=」記号が含まれている可能性があるためです。
マックスとラッセル、助けてくれてありがとう!