2017-11-20 5 views
0

パラメータに基づいて、2つのノード間の最短経路を計算します。戻り値の後にオブジェクトを逆シリアル化するNeo4J

私はこのクエリを持っています。 C#ので

MATCH p = (po:Ponto)-[r:VAI_PARA*]->(pd:Ponto) 
WHERE 1 = 1 
AND (po.PontoId = {p0}) 
AND (pd.PontoId = {p1}) 
WITH with p, reduce(d = 0, r in relationships(p) | d + r.Distancia) as totalDist 
RETURN p AS path, totalDist AS Distance 
ORDER BY totalDist DESC 
LIMIT {p4} 

、私はこのクエリを書いた:

var cypherQuery = _uow.GraphClient.Cypher 
    .Match($"p = (po:{PontoMapa.Label})-[r:{CaminhoRelacao.Label}*]->(pd:{PontoMapa.Label})") 
    .Where("1 = 1") 
    .AndWhere((PontoMapa po) => po.PontoId == query.PontoOrigemId) 
    .AndWhere((PontoMapa pd) => pd.PontoId == query.PontoDestinoId) 
    .With("p, reduce(d = 0, r in relationships(p) | d + r.Distancia) as totalDist") 
    .WithParams(new 
    { 
     query.PontoOrigemId, 
     query.PontoDestinoId 
    }) 
    .Return((p, totalDist) => new 
    { 
     path = p.As<dynamic>(), 
     Distance = totalDist.As<int>() 
    }) 
    .OrderByDescending("totalDist") 
    .Limit(1); 

それはこのような何かを返すされています:

╒══════════════════════════════╤═══════════╕ 
│"p"       │"totalDist"│ 
╞══════════════════════════════╪═══════════╡ 
│[{"PontoDeEntrada":true,"Ponto│40   │ 
│Id":"0eac5620-aeca-4b26-a3f2-5│   │ 
│631825829cb","Identificador":"│   │ 
│CTUPHA-0001"},{"Distancia":10}│   │ 
│,{"PontoDeEntrada":false,"Pont│   │ 
│oId":"40e00556-8625-4914-9774-│   │ 
│3f1a18962880","Identificador":│   │ 
│"CTUPHA-0002"},{"PontoDeEntrad│   │ 
│a":false,"PontoId":"40e00556-8│   │ 
│625-4914-9774-3f1a18962880","I│   │ 
│dentificador":"CTUPHA-0002"},{│   │ 
│"Distancia":10},{"PontoDeEntra│   │ 
│da":false,"PontoId":"ed856f2b-│   │ 
│f28f-4e5b-b69d-d4617247488e","│   │ 
│Identificador":"CTUPHA-0003"},│   │ 
│{"PontoDeEntrada":false,"Ponto│   │ 
│Id":"ed856f2b-f28f-4e5b-b69d-d│   │ 
│4617247488e","Identificador":"│   │ 
│CTUPHA-0003"},{"Distancia":10}│   │ 
│,{"PontoDeEntrada":false,"Pont│   │ 
│oId":"a7f8028f-9bd1-485e-899b-│   │ 
│0902e159a9fd","Identificador":│   │ 
│"CTUPHA-0004"},{"PontoDeEntrad│   │ 
│a":false,"PontoId":"a7f8028f-9│   │ 
│bd1-485e-899b-0902e159a9fd","I│   │ 
│dentificador":"CTUPHA-0004"},{│   │ 
│"Distancia":10},{"PontoDeEntra│   │ 
│da":false,"PontoId":"1a9b9e3a-│   │ 
│0333-417f-a5c5-e191dee8b9db","│   │ 
│Identificador":"CTUPHA-0005"}]│   │ 
└──────────────────────────────┴───────────┘ 

をしかし、私はリターンをデシリアライズしようとすると、パスがヌルいます。

このデータに適合するモデルを作成するにはどうすればよいですか?

また、別の方法で書かれたこの問題を助けるクエリが存在しますか?

答えて

0

キャストするにはdynamicを使用できません。したがって、p.As<dynamic>()は常に失敗してnullを返します。あなたは引き戻すために必要なものPathsResultさ:あなたはおそらくpからあなたが欲しいものを検討したい

var cypherQuery = _uow.GraphClient.Cypher 
    .Match($"p = (po:{PontoMapa.Label})-[r:{CaminhoRelacao.Label}*]->(pd:{PontoMapa.Label})") 
    .Where("1 = 1") 
    .AndWhere((PontoMapa po) => po.PontoId == query.PontoOrigemId) 
    .AndWhere((PontoMapa pd) => pd.PontoId == query.PontoDestinoId) 
    .With("p, reduce(d = 0, r in relationships(p) | d + r.Distancia) as totalDist") 
    .WithParams(new 
    { 
     query.PontoOrigemId, 
     query.PontoDestinoId 
    }) 
    .Return((p, totalDist) => new 
    { 
     path = p.As<PathsResult>(), //<< Change here 
     Distance = totalDist.As<int>() 
    }) 
    .OrderByDescending("totalDist") 
    .Limit(1); 

- あなたはノードをしたいですか?この場合、nodes(p)と一緒に遊んでください - PathsResultは実際に探しているものと異なる場合があります。/

+0

こんにちは、ありがとうございます。これはまさに私の疑いです。あなたが戻ってくる "p"アイテムを見ると、ノードとリレーションの奇妙なコレクションが見えます。私が収集したようなものを作り、po-r-pd – Jedi31

関連する問題