2016-03-30 2 views
2

Я хочу, чтобы получить следующий запрос в C# эквивалент:Сортировка по Отношения собственности Использование Neo4jClient C#

match(p:Person)-[r1:HAS]->(s:Shelf) 
optional match(s)-[r2:CONTAINS]->(l:Link) return p,s,l 
order by r2.time_modified; 

Первоначально я думал об этом, но он не работает:

var result = await this._graphClient.Cypher 
       .Match("(person:Person { person_id: {personId}})-[r1:HAS]->(shelf:Shelf)") 
       .OptionalMatch("(shelf)-[r2:CONTAINS]->(link:Link)") 
       .WithParams(new { personId = personId }) 
       .Return((shelf, link) => new 
        { 
        Shelf = shelf.As<Shelf>(), 
        Links = link.CollectAs<Link>() 
        }) 
       .OrderBy("r2.time_modified") 
       .ResultsAsync; 

Я получаю следующее исключение, r2 не определен

r2 не определен ... "ORDER BY r2.time_modified"

Я относительно новичок в использовании драйвера Neo4jClient C#. Может ли кто-нибудь помочь мне и объяснить мне, что происходит? Я также хочу знать, как это сделать.

Это трассировки стека:

в System.Threading.Tasks.Task.ThrowIfExceptional (Boolean) includeTaskCanceledExceptions на System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task 1.get_Result() в Neo4jClient.GraphClient , <> c__85 1.<PrepareCypherRequest>b__85_1(Task 1 ответ) в D: \ Temp \ d298ce3 \ Neo4jClient \ GraphClient.cs: линия 961 на System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke() at System.Threading.Tasks.Task.Execute() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1.ConfiguredTaskAwaiter.GetResult() на Neo4jClient.GraphClient.d__87 1.MoveNext() in D:\temp\d298ce3\Neo4jClient\GraphClient.cs:line 1022 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1. GetResult() на .... Repository.Neo4jRepository.d__23.MoveNext() в C: \ Users \ Williams \ Documents \ визуально студии 2015 \ Projects ... \ Repository \ Neo4jRepository.cs: строка 358

+0

Какого типа является исключением? Откуда он? то есть клиент или Neo4j возвращают его? –

+0

Я думаю, что это от клиента, потому что я написал то же самое в Neo4j, и он работал, но клиент возвращает исключение. –

+0

. Какого типа Исключение - откуда оно выбрано, вы также можете вставить больше содержимого исключения здесь –

ответ

2

Потому что вы сделайте Collect в Return даного, r2 больше не существует.

Вам нужно заказать до возвращения:

var query = gc.Cypher 
    .Match("(p:Person { person_id: 'a'})-[r1:HAS]->(s:Shelf)") 
    .OptionalMatch("(s)-[r2:CONTAINS]->(l:Link)") 
    .With("p,s,l") 
    .OrderBy("r2.time_modified") 
    .Return((p,s,l) => new 
    { 
     Person = p.As<Person>(), 
     Shelf = s.As<Shelf>(), 
     Links = l.CollectAs<Link>() 
    }); 
var res = query.Results; 
+0

Какова цель «с», пожалуйста? Почему он не содержит «r1» и «r2»? –

+0

Это один из лучших, которые я видел по этому вопросу. Спасибо за ваш вклад Крис. – Willie

+0

Подумайте о том, что 'With' является своего рода« объединителем »запросов, он используется довольно часто, когда вы хотите объединить множество запросов вместе. Например, как «Возврат» в середине вашего запроса, где вы можете использовать этот «Возврат» в следующем запросе и т. Д. И т. Д. - вот документы на нем: http://neo4j.com/docs/ стабильный/запрос-with.html –

1

Вам нужно ВОЗВРАТАТЬ r2.time_modified, прежде чем вы сможете заказать его.

match(p:Person)-[r1:HAS]->(s:Shelf) 
optional match(s)-[r2:CONTAINS]->(l:Link) 
return p,s,l,r2.time_modified 
order by r2.time_modified; 

Если возвращено, вы можете использовать его для заказа.

[EDIT]

Непроверенные:

var result = await this._graphClient.Cypher 
       .Match("(person:Person { person_id: {personId}})-[r1:HAS]->(shelf:Shelf)") 
       .OptionalMatch("(shelf)-[r2:CONTAINS]->(link:Link)") 
       .WithParams(new { personId = personId }) 
       .Return((shelf, link, r2) => new 
        { 
        Shelf = shelf.As<Shelf>(), 
        Links = link.CollectAs<Link>() 
        }) 
       .OrderBy("r2.time_modified") 
       .ResultsAsync; 
+0

Я получаю это так, как я могу получить его эквивалент C#? Можете ли вы добавить его в свой ответ для моего экзамена? –

+0

Я добавил. У меня не было времени, чтобы проверить его ... – erdelmaero

+0

Я просто протестировал его, но у меня было исключение. Правда в том, что я не создал это свойство во всех отношениях. Вот почему я использую «Необязательный матч». Я по-прежнему получаю то же исключение, что «r2» не определен. Есть ли способ заказать на всякий случай его доступность и игнорировать, если его нет? –

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