我如何在 Neo4j 图形数据库中检索关系

Posted

技术标签:

【中文标题】我如何在 Neo4j 图形数据库中检索关系【英文标题】:How do i retrieve a relationship in Neo4j graph database 【发布时间】:2012-09-19 08:44:23 【问题描述】:

请耐心等待我是新手: 我目前正在使用.Net neo4jClient。目前我有一个 Share 节点和一个 Customer 节点。我正在他们之间创建关系 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)

但这会返回我的 RelationshipInstance 对象,它没有我需要的数据(数量、CostPerShare 等)。

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

graphClient.ExecuteGetAllRelationshipsGremlin<>()

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

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

提前致谢

【问题讨论】:

【参考方案1】:

抱歉,您花时间给您,您真正想要的是“RelationshipInstance&lt;CustomerOwnsShare&gt;”...

所以,假设我有以下设置:

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]

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

【讨论】:

以上是关于我如何在 Neo4j 图形数据库中检索关系的主要内容,如果未能解决你的问题,请参考以下文章

社交应用的多对多关系:Mongodb 或 Neo4j 等图形数据库

Neo4j 第二篇:图形数据库

Neo4J与NeoModel:如何加速图形创建?

如何可视化从嵌入式 Neo4j Java 应用程序创建的 Neo4j 图形数据库

关于neo4j初入门

centos 安装neo4j图形数据库