我可以创建一个关系,我有它的RelationshipReference。但是我如何得到剩余的与有效载荷的关系呢?
使用Node我可以只是client.Get(nodeid),但是AFAIK对于关系没有任何相似之处。
格雷姆林是走的路吗?如果是这样的话 - 有人可以给我一个暗示,因为我仍然试图通过Neo4jClient来做这件事。
答案 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应该只有一个半星期。)