2013-11-06 3 views
1

Я довольно новичок в Neo4j и Neo4jClient, и я только начинаю писать свободно владеющие Cypher, чтобы создать отношения, если они еще не существуют. Я запускаю Neo4j 2.0 beta, так как примеры в вики Neo4jClient, по-видимому, равны 2.0.Ошибка Neo4jClient - SyntaxException: для идентификации узлов в шаблонах требуются скобки .CreateUnique

Когда я запускаю его я получаю следующее сообщение об ошибке:

SyntaxException: Parenthesis are required to identify nodes in patterns 
"CREATE UNIQUE app-[:APP_OF]->{root}" 
       ^

В^точек на дефис после приложения.

Я был бы очень признателен, если бы кто-нибудь мог сказать мне, что я сделал неправильно.

Это два вопроса cypher, которые создают приложение, если оно еще не существует, а затем создайте связь, если она не существует.

// Create App 
client.Cypher 
.Merge("(app:App {Id: {id}})") 
.OnCreate("app") 
.Set("app = {newApp}") 
.WithParams(new { id = a.Id, newApp = a }) 
.ExecuteWithoutResults(); 

// Create Relationship 
client.Cypher 
.Match("(app:App)") 
.Where((App app) => app.Id == a.Id) 
.CreateUnique("app-[:APP_OF]->{root}") // this is the error line 
.WithParam("root", client.RootNode) 
.ExecuteWithoutResults(); 

Интересно, есть ли способ объединить их в один запрос?

И должен ли я беспокоиться о подключении к корневому узлу, или нормально, чтобы узлы приложения плавали. Я понимаю, что стартовый узел больше не требуется, так что соединение с корнем не требуется? Тем не менее, мне все равно нужен этот код для других отношений.

Большое спасибо за вашу помощь :)

Edit: Это пример, я следовал из http://hg.readify.net/neo4jclient/wiki/cypher-examples

graphClient.Cypher 
    .Match("(user1:User)", "(user2:User)") 
    .Where((User user1) => user1.Id == 123) 
    .AndWhere((User user2) => user2.Id == 456) 
    .CreateUnique("user1-[:FRIENDS_WITH]->user2") 
    .ExecuteWithoutResults(); 

ответ

1

Эта проблема, как вы снабжая параметры:

.CreateUnique("app-[:APP_OF]->{root}") 
.WithParam("root", client.RootNode) 

Вы не можете передать ссылку на узел таким образом.

Вы должны были бы использовать предложение START принести узел в запрос:

client.Cypher 
    .Start(new { root = client.RootNode }) 
    .Match("(app:App)") 
    .Where((App app) => app.Id == a.Id) 
    .CreateUnique("app-[:APP_OF]->root") 
    .ExecuteWithoutResults(); 

Теперь, отвечая на ваш следующий вопрос об объединении их, это должно работать:

client.Cypher 
    .Start(new { root = client.RootNode }) 
    .Merge("(app:App {Id: {id}})") 
    .OnCreate("app") 
    .Set("app = {newApp}") 
    .CreateUnique("app-[:APP_OF]->root") // this is the error line 
    .WithParams(new { id = a.Id, newApp = a }) 
    .ExecuteWithoutResults(); 

(Примечание: я не пробовал работать, хотя: я просто набрал его здесь.)

HOWEVER Вы не хотите, чтобы использование client.RootNode. Это API для ссылочного узла, который устарел в версии 2.0: http://docs.neo4j.org/chunked/milestone/deprecations.html. Нам понадобился только корневой узел, прежде чем у нас были метки.В этом случае вы, похоже, используете его, чтобы снова найти все узлы приложения в будущем, однако вам не нужно это делать, потому что теперь вы можете найти их на основе их ярлыков.

+0

Большое спасибо @Tatham, это мне очень поможет. Я не буду беспокоиться об отношениях с корневым узлом, но я буду использовать это для других отношений. Я рассмотрю документ обесценивания, так как большинство примеров и руководств, которые я нахожу, кроме вашего, относятся к 1.9. Я также буду больше смотреть на Сайфера, чтобы лучше понять его. Большое спасибо! – tekiegirl

0

Я думаю, что это означает, что вы должны поместить идентификатор узла в скобках:

"CREATE UNIQUE (app)-[:APP_OF]->{root}" 

Что касается объединения их в один запрос, это то, что вы хотели бы сделать. Некоторое время назад я перестала использовать Neo4jClient, поэтому я не помню синтаксиса точно. Однако это будет похоже на шифр.

START r=node({root}) 
MERGE (app:App {Id: {id}}) 
    ON CREATE app 
    SET app = {newApp} 
WITH r, app CREATE UNIQUE (app)-[:APP_OF]->(r) 

Поэтому в основном вам просто нужно начать с корня, и использовать WITH, чтобы присоединиться к CREATE UNIQUE к MERGE