简体   繁体   中英

Ordering By Relationship Property Using Neo4jClient C#

I want to get the following query in its C# equivalent:

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

I initially thought about this but it doesn't work:

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;

I get the following exception that r2 isn't defined

r2 not defined ... "ORDER BY r2.time_modified"

I am relatively new to using the Neo4jClient C# driver. Can anyone please help me and explain to me what's happening? I also want to know how to pull this off.

This is the stack trace:

at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task 1.get_Result() at Neo4jClient.GraphClient.<>c__85 1.<PrepareCypherRequest>b__85_1(Task 1 response) in D:\\temp\\d298ce3\\Neo4jClient\\GraphClient.cs:line 961 at 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() at 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.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() at ....Repository.Neo4jRepository.d__23.MoveNext() in C:\\Users\\Williams\\documents\\visual studio 2015\\Projects...\\Repository\\Neo4jRepository.cs:line 358

Because you do the Collect in the Return statment, r2 doesn't exist anymore.

You need to order before returning:

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;

You need to RETURN r2.time_modified before you can order results by it.

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;

If it is returned you can use it for ORDER BY.

[EDIT]

Untested:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM