リレーションを作成でき、RelationshipReferenceがあります。しかし、ペイロードとすべての関係の残りをどのように取得しますか?
ノードを使用すると、client.Get(nodeid)だけを実行できますが、AFAIKではリレーションに類似したものはありません。
グレムリンは行く道ですか?もしそうなら-私はまだNeo4jClientを介してそれを行う方法について試行錯誤しているので、誰かが私にヒントを与えることができます。
リレーションを作成でき、RelationshipReferenceがあります。しかし、ペイロードとすべての関係の残りをどのように取得しますか?
ノードを使用すると、client.Get(nodeid)だけを実行できますが、AFAIKではリレーションに類似したものはありません。
グレムリンは行く道ですか?もしそうなら-私はまだNeo4jClientを介してそれを行う方法について試行錯誤しているので、誰かが私にヒントを与えることができます。
IGraphClient自体に拡張メソッドを使用できます。
public static class GraphClientExtensions
{
public static RelationshipInstance<T> GetRelationship<T>(this IGraphClient graphClient, RelationshipReference relationshipReference) where T : Relationship, new()
{
if(graphClient == null)
throw new ArgumentNullException("graphClient");
if(relationshipReference == null)
throw new ArgumentNullException("relationshipReference");
var rels = graphClient.ExecuteGetAllRelationshipsGremlin<T>(string.Format("g.e({0}).outV.outE", relationshipReference.Id), null);
return rels.SingleOrDefault(r => r.Reference == relationshipReference);
}
}
使用法:(IsFriendOfはRelationship派生クラスであり、Dataは単なるPOCOです)
var d1 = new Data{Name = "A"};
var d2 = new Data{Name = "B"};
var d1Ref = graphClient.Create(d1);
var d2Ref = graphClient.Create(d2);
var rel = new IsFriendOf(d2Ref) { Direction = RelationshipDirection.Outgoing };
var relRef = graphClient.CreateRelationship(d1Ref, rel);
//USAGE HERE
var relBack = graphClient.GetRelationship<IsFriendOf>(relRef);
理想的ではありませんが、コードが少し読みやすくなります。(さらに、ノードを知る必要はなく、関係参照だけを知る必要があります)
これの変形として、私はこれを機能させました:
// Get every relation going out from the node we used as out-node
// when we created the relation.
var query = string.Format("g.v({0}).outE", fromNodeID);
var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
query, null
);
// We can get too many so filter per ID.
var rel = rels.Single(r => r.Reference.Id == relID);
しかし、これは私が望んでいる方法ではありません。私はIDを持っていて、それを使うのが一番速いでしょうね。
私が試してみました
var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
"g.e(42)", null
);
しかし、発生するのは、例外が発生することだけです。
{"Cannot access child value on Newtonsoft.Json.Linq.JProperty."}
そもそもシリアル化されたペイロードには何もありません。(バグ?)また:<MyPayload>を削除しても効果はありません。したがって、これは逆シリアル化の問題ではないと思います。ただし、クエリ「ge(42)」の結果は、回避策として言及されている「gv(11).outE」と同じではありません。
(Neo4jのバージョンは1.9.M04であり、私のNeo4jClientは1週間半しか経っていないはずです。)