2016-03-30 6 views
2

ich die folgende Abfrage in seiner C# -Äquivalent erhalten möchten:Bestellung von Beziehung Property Mit 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; 

ich anfangs dachte darüber nach, aber es funktioniert nicht:

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; 

ich die folgende Ausnahme, daß R2 nicht

definiert

r2 nicht definiert ... "ORDER BY r2.time_modified"

Ich bin relativ neu in der Verwendung des Neo4jClient C# -Treibers. Kann mir bitte jemand helfen und mir erklären was los ist? Ich möchte auch wissen, wie ich das durchziehen kann.

Dies ist der Stack-Trace:

bei System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) bei System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task 1.get_Result() bei Neo4jClient.GraphClient . <> c__85 1.<PrepareCypherRequest>b__85_1(Task 1 response) in D: \ temp \ d298ce3 \ Neo4jClient \ GraphClient.cs: Linie 961 bei 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() bei 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() an .... Repository.Neo4jRepository.d__23.MoveNext() in C: \ Benutzer \ Williams \ Dokumente \ Visual Studio 2015 \ Projects ... \ Repository \ Neo4jRepository.cs: Linie 358

+0

Welche ist die Ausnahme? Woher kommt es? Ist es der Kunde oder Neo4j, der es zurückgibt? –

+0

Ich denke, es ist vom Client cos Ich schrieb die gleiche Sache in Neo4j und es funktioniert, aber der Client gibt die Ausnahme zurück –

+0

Welcher Typ ist die Ausnahme - wo ist es geworfen, können Sie auch mehr Inhalt der Ausnahme hier einfügen –

Antwort

2

Weil Sie die Collect im Return statment tun, r2 existiert nicht mehr.

Sie müssen vor bestellen Rückkehr:

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

Was ist der Zweck von "mit" bitte? Warum enthält es nicht 'r1' und 'r2'? –

+0

Dies ist eines der besten, die ich in Bezug auf diese Frage gesehen habe. Danke für deine Eingabe Chris. – Willie

+0

Denken Sie an "With" als eine Art "Kombinierer" von Abfragen, es wird häufig verwendet, wenn Sie viele Abfragen zusammen kombinieren möchten. Ein bisschen wie eine 'Return' in der Mitte Ihrer Abfrage - wo Sie dann diese' Return' in der nächsten Abfrage verwenden können und so weiter - hier ist die Dokumentation: http://neo4j.com/docs/ stable/query-with.html –

1

Sie müssen r2.time_modified ZURÜCKGEBEN, bevor Sie die Ergebnisse bestellen können.

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; 

Wenn es zurückgegeben wird, können Sie es für ORDER BY verwenden.

[EDIT]

Ungeprüfte:

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

Ich bekomme es so wie bekomme ich es C# entspricht? Kannst du es deiner Antwort für meine Untersuchung hinzufügen? –

+0

Ich habe es hinzugefügt. Ich hatte keine Zeit es zu testen ... – erdelmaero

+0

Ich habe es gerade getestet, aber ich hatte eine Ausnahme. Die Wahrheit ist, dass ich diese Eigenschaft nicht in allen Beziehungen geschaffen habe. Deshalb verwende ich "Optional Match". Ich bekomme immer noch die selbe Ausnahme, dass "r2" nicht definiert ist. Gibt es eine Möglichkeit zu bestellen, nur wenn es verfügbar ist und ignorieren, wenn es nicht da ist? –