1

私は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に干渉する可能性のある「?&=」記号が含まれている可能性があるためです。

マックスとラッセル、助けてくれてありがとう!

4

1 に答える 1

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=

「/」は物事を台無しにしていると思います。

于 2012-07-18T23:43:14.077 に答える