1

リレーションを作成でき、RelationshipReferenceがあります。しかし、ペイロードとすべての関係の残りをどのように取得しますか?

ノードを使用すると、client.Get(nodeid)だけを実行できますが、AFAIKではリレーションに類似したものはありません。


グレムリンは行く道ですか?もしそうなら-私はまだNeo4jClientを介してそれを行う方法について試行錯誤しているので、誰かが私にヒントを与えることができます。

4

2 に答える 2

3

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);

理想的ではありませんが、コードが少し読みやすくなります。(さらに、ノードを知る必要はなく、関係参照だけを知る必要があります)

于 2013-02-27T12:02:43.343 に答える
0

これの変形として、私はこれを機能させました:

// 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週間半しか経っていないはずです。)

于 2013-02-27T10:35:14.413 に答える