0

クエリで指定されたノード(64)と関係があるすべてのノードとその名前を返したいCypherクエリを実行するメソッドがあります。

start n = node(64) match (n)--(x) return x.Name;

これをコードで実行しようとすると、機能しなくなります。これが私の方法です:

public string GetAllFirstLevelRelatives(long NodeId)
{

    string QueryResult = null;

    try
    {
        var query = client_connection
            .Cypher
            .Start(NodeId, client_connection.RootNode)
            .Match(NodeId, "--(x)")
            .Return<Node<GraphNode>>("(x).name");

        QueryResult = query.Results.ToString();
    }
    catch (Exception e)
    {

    }
    return QueryResult;
}

このクエリで名前を返したいのですが。

誰か助けてくれませんか?

4

1 に答える 1

7

このクエリ:

start n = node(64) match n--x return x.Name;

C#では次のように記述する必要があります。

var query = graphClient
    .Cypher
    .Start("n", node)           // START n=node(123)
    .Match("n--x")              // MATCH n--x
    .Return<string>("x.Name");  // RETURN x.Name

提供したサンプルコードにはいくつか問題がありました。

  1. 複数のノードが存在する可能性がありますが、メソッドは単一のstring結果しか返していませんでした。呼び出すと、実際の結果ではなく、のResults.ToString()ようなものが返されます。"System.Collections.IEnumberable<string>"
  2. longノードIDをsとして渡すことは避けてください。そうすることで、生の数値を使用するように促されますが、これは実行すべきではありません。代わりに、を使用してNodeReferenceください。Neo4jClientで実行するクエリはすべて、NodeReferenceオブジェクトを返します。これを使用して、次のクエリを実行します。最初のクエリを開始するために、を提供しIGraphClient.RootNodeます。基本的に、ノードIDに触れる必要はありません。
  3. セクションが空のtry {} catch {}ブロックで.NETコードをラップすることは、常に大きな問題です。これをコードで記述しないでください。:)catch
  4. x.Nameおそらく文字列ですが、これを。で呼び出していました.Return<Node<GraphNode>>。これは基本的に「ロードx.Name(文字列)」と言いますが、「」として返してくださいNode<GraphNode>。それはあまり意味がありません。タイプを一致させる必要があります。

上で書いたクエリとそれらのポイントを組み合わせると、これはあなたのメソッドがどのように見えるべきかです:

public IEnumerable<string> GetAllFirstLevelRelatives(NodeReference node)
{
    var query = graphClient
        .Cypher
        .Start("n", node)           // START n=node(123)
        .Match("n--x")              // MATCH n--x
        .Return<string>("x.name");  // RETURN x.name

    return query.Results.ToList();
}

これをさらに改善するには、私たちの型システムを利用する必要があります。xクエリの「」とは何ですか?それが映画だと想像してみましょう。

ムービーノードに含まれるものを説明するクラスを作成する必要があります。

public class Movie
{
    public string Name { get; set; }
}

そのクラスは「POCO」(プレーンな古いクラスオブジェクト)である必要があります。つまり、メソッドやロジックではなく、基本的なプロパティのみが含まれている必要があります。

次に、クエリでこのタイプ情報を使用します。

public IEnumerable<Movie> GetAllRelatedMovies(NodeReference node)
{
    var query = graphClient
        .Cypher
        .Start("n", node)
        .Match("n--movie")
        .Return<Movie>("movie");

    return query.Results.ToList();
}

これで、文字列のリストだけでなく、映画のリストができました。映画の名前だけが必要になる可能性はほとんどないため、この方法ですべてのプロパティにアクセスできます。

于 2013-03-28T01:03:16.860 に答える