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 应该只有一周半的时间。)

于 2013-02-27T10:35:14.413 回答