C# 使用Neo4jClient C按关系属性排序#

C# 使用Neo4jClient C按关系属性排序#,c#,neo4j,neo4jclient,C#,Neo4j,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 { pers

我希望获得以下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;
var result=等待此消息。_graphClient.Cypher
.Match(((person:person{person\u id:{personId}})-[r1:HAS]->(shelf:shelf)”)
.OptionalMatch(“(工具架)-[r2:包含]->(链接:链接)”)
.WithParams(新的{personId=personId})
.Return((工具架,链接)=>新建
{
Shelf=Shelf.As(),
Links=link.CollectAs()
})
.OrderBy(“r2.time\u修改”)
.ResultsAsync;
我得到以下未定义r2的异常

r2未定义。。。 “按r2订购。时间\u已修改”

我对使用Neo4jClient C#驱动程序比较陌生。谁能帮我解释一下发生了什么事?我还想知道如何做到这一点

这是堆栈跟踪:

位于System.Threading.Tasks.Task.ThrowifeException(布尔值IncludeTaskCanceledException) 位于System.Threading.Tasks.Task
1.GetResultCore(布尔waitCompletionNotification)
在System.Threading.Tasks.Task中
1.get_Result() 在D:\temp\d298ce3\Neo4jClient\GraphClient.cs中的Neo4jClient.c_uu85
1.b_u85_u1(任务
1响应)处:第961行 在System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke()中
在System.Threading.Tasks.Task.Execute()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.ConfiguredTaskAwaitable
1.ConfiguredTaskAwaiter.GetResult()中 在d:\temp\d298ce3\Neo4jClient\GraphClient.cs中的Neo4jClient.d_u87
1.MoveNext()处:第1022行
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() 位于C:\Users\Williams\documents\visual studio 2015\Projects…\Repository\Neo4jRepository.cs中的…Repository.Neo4jRepository.d_u23.MoveNext():第358行


您需要返回r2.time\u 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;
如果退货,您可以将其用于订购

[编辑]

未经测试:

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;
var result=等待此消息。_graphClient.Cypher
.Match(((person:person{person\u id:{personId}})-[r1:HAS]->(shelf:shelf)”)
.OptionalMatch(“(工具架)-[r2:包含]->(链接:链接)”)
.WithParams(新的{personId=personId})
.Return((工具架、链接、r2)=>新建
{
Shelf=Shelf.As(),
Links=link.CollectAs()
})
.OrderBy(“r2.time\u修改”)
.ResultsAsync;

因为您在
返回
语句中执行了
收集
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;
var query=gc.Cypher
.Match(“(p:Person{Person_id:'a'})-[r1:HAS]->(s:Shelf)”)
.OptionalMatch(“(s)-[r2:包含]->(l:链接)”)
.带有(“p、s、l”)
.OrderBy(“r2.time\u修改”)
.返回((p、s、l)=>新
{
Person=p.As(),
Shelf=s.As(),
Links=l.CollectAs()
});
var res=query.Results;

我得到了它,那么如何得到它的C等价物呢?你能把它加到我考试的答案里吗?我刚考过,但有个例外。事实上,我并没有在所有的关系上创建这个属性。这就是我使用“可选匹配”的原因。我仍然得到相同的例外,“r2”没有定义。是否有一种方法可以在它可用的情况下进行排序,如果它不存在则忽略它?即使某些属性为空,它也应该可以工作。也许你可以看看这个帖子:例外是什么类型的?它是从哪里来的?i、 是客户机还是Neo4j返回的?我想是客户机,因为我在Neo4j中写了同样的东西,它工作了,但客户机返回异常异常是什么类型的异常-它从哪里抛出,您还可以将更多异常内容粘贴到此处异常名称是SyntaxException,源是Neo4jClient,NeoMessage是“r2未定义(第4行第10列(偏移量:179)),顺序为r2.time_modified“^你的密码很好用,对吧?请问‘with’的目的是什么?为什么它不包含“r1”和“r2”?这是关于这个问题我见过的最好的答案之一。感谢您的输入Chris。将
With
视为一种查询的“组合器”,当您想要将大量查询组合在一起时,经常会用到它。在查询的中间,类似于<代码>返回<代码>——在这里您可以使用下一个查询中的“<代码>返回< /代码>”等等,下面是文档: