このクエリ:
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
提供したサンプルコードにはいくつか問題がありました。
- 複数のノードが存在する可能性がありますが、メソッドは単一の
string
結果しか返していませんでした。呼び出すと、実際の結果ではなく、のResults.ToString()
ようなものが返されます。"System.Collections.IEnumberable<string>"
long
ノードIDをsとして渡すことは避けてください。そうすることで、生の数値を使用するように促されますが、これは実行すべきではありません。代わりに、を使用してNodeReference
ください。Neo4jClientで実行するクエリはすべて、NodeReference
オブジェクトを返します。これを使用して、次のクエリを実行します。最初のクエリを開始するために、を提供しIGraphClient.RootNode
ます。基本的に、ノードIDに触れる必要はありません。
- セクションが空の
try {} catch {}
ブロックで.NETコードをラップすることは、常に大きな問題です。これをコードで記述しないでください。:)catch
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();
}
これで、文字列のリストだけでなく、映画のリストができました。映画の名前だけが必要になる可能性はほとんどないため、この方法ですべてのプロパティにアクセスできます。