私は Neo4j を使い始めましたが、同時に読んでいるノードのプロパティを更新すると、非常に悪い動作に気付きました。私が書いた clojure コードは、Neocons ライブラリを使用して Neo4j と通信します。
(ns ams.utils.t.test-cypher-error
(:require [clojurewerkz.neocons.rest :as rest]
[clojurewerkz.neocons.rest.nodes :as nodes]
[clojurewerkz.neocons.rest.cypher :as cypher]))
(rest/connect! "http://192.168.0.101:7474/db/data")
(def counter-id (:id (nodes/create {:counter 0})))
(defn update-counter [] (cypher/query "START c = node({id}) SET c.counter = c.counter + 1 RETURN c.counter as counter" {"id" counter-id}))
(doall (apply pcalls (repeat 10 update-counter)))
(println "Counter:" ((comp :counter :data) (nodes/get counter-id)))
(nodes/destroy counter-id)
結果を推測してください:
Counter: 4
5 の場合も 4 の場合もありますが、ここで問題が発生します。節START
とSET
節の間でカウンターの値が変更されますが、cypher はそれをキャッチしません!
ここで2つの質問:
- 私は何か間違ったことをしていますか?
- Neo4j に実行可能なユニークなカウンターレスト生成アルゴリズムはありますか?
Neo4j のバージョンは 1.9RC1 です。よろしくお願いします。