Поддержка транзакций будет поставляться с Neo4j 2.0 и более поздней версией Neo4jClient. Этот вопрос отслеживание работы: https://bitbucket.org/Readify/neo4jclient/issue/91/support-cypher-transactions-integrated
Это не дает вам уникальность, хотя ...
Neo4j не имеет уникальные индексы ничего автоматически применять эту идею. (Я ожидаю, что мы увидим это с лейблами Neo4j 2.0 в будущем, но еще нет.)
Вам необходимо либо a) знать, что то, что вы создаете, уникально, либо б) сначала проверьте.
Вы, кажется, берете маршрут B.
Сделки позволяют выполнить проверку, а затем создать в рамках одного транзакционного действия, но все же несколько вызовов по проводу.
Выбранный текст Cypher на самом деле предпочтительнее: вы делаете чек и создаете в одном заявлении. Я заинтригован, чтобы узнать, почему вы думаете, что это взломать.
Вы можете выполнить это заявление через Neo4jClient что-то вроде:
var id = 123;
graphClient.Cypher
.Start(new { n = Node.ByIndexLookup("node_auto_index", "name", id)})
.With("count(*) as c")
.Where("c=0")
.Create("x={0}", new MyType { name = id })
.Return<Node<MyType>>("c")
Некоторых высказываний With
и Where
бы хорошо, если бы они были чисты, но это функциональное сейчас.
Также существует статья Cypher's CREATE UNIQUE
, которая может также охватывать ваш сценарий.
Спасибо, Tatham. В моем сценарии я не могу знать, что узлы уникальны, когда я их создаю, поэтому сначала нужно проверить. Я попробовал CREATE UNIQUE, но он требует, чтобы у вас были узлы и соединения. В моем случае мне пришлось сначала создать уникальный узел. Это выглядело как хак, потому что я отправлял сырой Cypher по проводу, который вы настоятельно рекомендуете против. :-) –
Я рекомендую не использовать ExecuteRawCypherQuery. Использование IGraphClient.Cypher для выполнения операции with, где и создание в порядке. –
В чем преимущество этого? Похоже, что почти все аргументы являются необработанными текстовыми строками. Что получается путем передачи 4-5 текстовых строк над одной текстовой строкой? –