3

请耐心等待我是新手:我目前正在使用.Net neo4jClient。目前我有一个共享节点和一个客户节点。我正在他们之间创建关系CustomerOwnsShare并将其持久化。

这是我的关系课

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)

但这会返回没有我需要的数据(数量、CostPerShare 等)的关系实例对象。

RelationshipInstance公开了一个RelationshipReference对象,但即使这样也不能帮助我检索我的实际关系对象。在深入挖掘时,我发现我可以执行 Raw gremlin 查询,如下所示

graphClient.ExecuteGetAllRelationshipsGremlin<>()

但它的函数签名也返回了一个 IEnumerable 的RelationshipInstance

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

提前致谢

4

1 回答 1

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]

同样,只是为了提醒自己。

于 2012-09-24T10:16:58.417 回答