2013-05-10 3 views
4

Есть ли способ обеспечить уникальность при создании узла с помощью neo4jclient?Обеспечить уникальные узлы с neo4jclient

Эта ссылка transactions показывает, как это сделать, используя java и транзакции, но я не вижу поддержки транзакций в neo4jclient. Я был в состоянии сделать это с помощью явного Cypher-то строка запроса, как это:

"start n=node:node_auto_index(name={id}) 
with count(*) as c 
where c=0 
create x={name:{id}} 
return c" 

Но это, очевидно, хак. Есть ли способ лучше?

ответ

2

Поддержка транзакций будет поставляться с 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, которая может также охватывать ваш сценарий.

+0

Спасибо, Tatham. В моем сценарии я не могу знать, что узлы уникальны, когда я их создаю, поэтому сначала нужно проверить. Я попробовал CREATE UNIQUE, но он требует, чтобы у вас были узлы и соединения. В моем случае мне пришлось сначала создать уникальный узел. Это выглядело как хак, потому что я отправлял сырой Cypher по проводу, который вы настоятельно рекомендуете против. :-) –

+0

Я рекомендую не использовать ExecuteRawCypherQuery. Использование IGraphClient.Cypher для выполнения операции with, где и создание в порядке. –

+0

В чем преимущество этого? Похоже, что почти все аргументы являются необработанными текстовыми строками. Что получается путем передачи 4-5 текстовых строк над одной текстовой строкой? –

Смежные вопросы