2013-12-14 17 views
5

Neo4j 2.0.0でうまく動作する以下のCypherクエリがあります。オブジェクトリストとして最短経路のすべてのノードを返します

MATCH (ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), 
p = shortestPath((ab)-[*..150]-(cd)) 
RETURN p 

Neo4jClientの次のクエリでエラーが発生します。機能の評価がタイムアウトしました。

var pathsQuery = 
      client.Cypher 
      .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))") 
      .Return<IEnumerable<PointEntity>>("extract(n in nodes(p) : id(n))"); 

とXclave上の他の同様の作業を以下の後

http://geekswithblogs.net/cskardon/archive/2013/07/23/neo4jclient-ndash-getting-path-results.aspx

として結果値:関数の評価時限アウト。

var pathsQuery = 
      client.Cypher 
      .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))") 
      .Return(p => new PathsResult<PointEntity> 
       { 
        Nodes = Return.As<IEnumerable<Node<PointEntity>>>("nodes(p)"), 
       }); 

C#でクエリから返されたすべてのノードをPointEntity型のリストとして取得するにはどうすればよいですか?

EDIT:

私はこのコードからノードとの関係のURIを取り戻すことができました:

var pathsQuery = 
      client.Cypher 
      .Match("(ab:Point { Latitude: 24.96325, Longitude: 67.11343 }),(cd:Point { Latitude: 24.95873, Longitude: 67.10335 }), p = shortestPath((ab)-[*..150]-(cd))") 
var results = pathsQuery.Return<PathsResult>("p").Results; 

ここクレイグ・ブレットのブログに続き: http://craigbrettdevden.blogspot.co.uk/2013/03/retrieving-paths-in-neo4jclient.html

私が試しましたPOCOを取得するのにエラーが発生しました:

var paths = pathsQuery.Returns<PathsResult>("EXTRACT(n in nodes(p) : n) AS Nodes, EXTRACT(rel in rels(p) : rel) AS Relationships", CypherResultMode.Projection).Results; 

エラー:

'Neo4jClient.Cypher.ICypherFluentQuery' does not contain a definition for 'Returns' and no extension method 'Returns' accepting a first argument of type 'Neo4jClient.Cypher.ICypherFluentQuery' could be found (are you missing a using directive or an assembly reference?) 

答えて

8

私は最初のクエリが機能しない理由のNeo4jの私のバージョンは私が私のMATCH句のパラメータを使わせていないとして、私は今それをテストすることはできませんと言うことはできません。しかし、私は私のバージョン(下)がうまく反応します。タイムアウトの点では、[*..150]は潜在的な潜在的な潜在的なトラバーサルです。

あなたが実行してみてください可能性:

PathsResultは次のように定義されて
var pathsQuery = 
    Client.Cypher 
     .Match("p = shortestPath((ab:Point)-[*..150]-(cd:Point))") 
     .Where((PointEntity ab) => ab.Latitude == 24.96325) 
     .AndWhere((PointEntity ab) => ab.Longitude == 67.11343) 
     .AndWhere((PointEntity cd) => cd.Latitude == 24.95873) 
     .AndWhere((PointEntity cd) => cd.Longitude == 67.10335) 

     .Return(p => new PathsResult<PointEntity> 
         { 
          Nodes = Return.As<IEnumerable<Node<PointEntity>>>("nodes(p)"), 
          Relationships = Return.As<IEnumerable<RelationshipInstance<object>>>("rels(p)") 
         }); 

var res = pathsQuery.Results; 

:ここでの利点はWHERE節がparamaterizedされていることである

public class PathsResult<TNode> 
{ 
    public IEnumerable<Node<TNode>> Nodes { get; set; } 
    public IEnumerable<RelationshipInstance<object>> Relationships { get; set; } 
} 

関連する問題