2012-09-19 63 views
3

请耐心等待我对此很陌生: 我目前使用.Net neo4jClient。目前我有一个分享节点和一个客户节点。我正在创建他们之间的关系CustomerOwnsShare并坚持它。我如何检索Neo4j图形数据库中的关系

这里是我的关系类

public class CustomerOwnsShare : 
    Relationship, 
    IRelationshipAllowingSourceNode<Customer>, 
    IRelationshipAllowingTargetNode<Share> 
{ 
    public CustomerOwnsShare(NodeReference targetNode) 
     : base(targetNode) 
    { 

    } 

    public int Quantity { get; set; } 
    public float CostPerShare { get; set; } 
    public string DateOfPurchase { get; set; } 
    public string ShareSymbol { get; set; } 

    public const string TypeKey = "CUSTOMER_OWNS_SHARE"; 
    public override string RelationshipTypeKey 
    { 
     get { return TypeKey; } 
    } 
} 

我们检索关系的列表,从我使用LINQ如下

IEnumerable<RelationshipInstance> relationshipInstances = 
      graphClient.RootNode.In<Customer>(CustomerBelongsTo.TypeKey, c => c.Email == email) 
      .OutE(CustomerOwnsShare.TypeKey) 

数据库回来,但这个返回我RelationshipInstance对象,没有按没有我需要的数据(数量,CostPerShare等)。

RelationshipInstance暴露了RelationshipReference对象,但即使这并不能帮助我找回我的实际关系对象。 在挖得更深一些,我知道我可以执行原小鬼查询如下

graphClient.ExecuteGetAllRelationshipsGremlin<>() 

但该函数签名也返回我RelationshipInstance的IEnumerable。

任何想法或建议,我如何检索我的实际持久关系对象与它的数据?

由于提前

回答

3

很抱歉的时间让这个给你,你真正想要的是一个“RelationshipInstance<CustomerOwnsShare>” ......

所以,让我们假装我有以下设置:

Root(0) -[]-> User(1) -[CUSTOMER_OWNS_SHARE]-> MSFT(2) 

括号中的数字是neo4j引用。 我将执行使用neo4jclient查询是:

var results = graphClient.ExecuteGetAllRelationshipsGremlin<CustomerOwnsShare>("g.v(2).inE", null); 
var quant = results[0].Data.Quantity; //etc 

现在,如果你只是复制/粘贴此,你会得到一个错误:

'CustomerOwnsShare' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TData' in the generic type or method 'Neo4jClient.GraphClient.ExecuteGetAllRelationshipsGremlin<TData>(string, System.Collections.Generic.IDictionary<string,object>)' 

这是一种痛苦的样子的解决办法是把一个参数的构造函数到您的CustomerOwnsShare类:

[EditorBrowsable(EditorBrowsableState.Never)] 
public CustomerOwnsShare() : base(0) { } 

这是对你罚款,因为TargetNode将由解串器进行设置。 你想确保你自己不使用该构造函数。该“EditorBrowsable”将防止外部组件从看到它,但不幸的是,在同一个组件中的任何代码都不会做,所以你可能想将其标记为:

[Obsolete] 

为好,只是为行动提醒你自己。

相关问题