如何使用Neo4jClient通过其ID获取Neo4j关系?

时间:2013-02-26 10:23:29

标签: .net neo4j neo4jclient

我可以创建一个关系,我有它的RelationshipReference。但是我如何得到剩余的与有效载荷的关系呢?

使用Node我可以只是client.Get(nodeid),但是AFAIK对于关系没有任何相似之处。


格雷姆林是走的路吗?如果是这样的话 - 有人可以给我一个暗示,因为我仍然试图通过Neo4jClient来做这件事。

2 个答案:

答案 0 :(得分: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);

它并不理想,但它确实使您的代码更容易阅读。 (另外,您不需要知道节点,只需要知道关系参考)

答案 1 :(得分:0)

作为this的变体,我让这个工作:

// 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."}  

有效负载中没有任何内容可以序列化。 (bug?)另外:删除&lt; MyPayload&gt;没有帮助。所以我不认为这是一个反序列化的问题;但是查询“g.e(42)”的结果与作为工作方法提到的“g.v(11).outE”不同。

(Neo4j版本是1.9.M04而我的Neo4jClient应该只有一个半星期。)