【问题标题】:How can I load a vertex with related vertex as a collection如何加载具有相关顶点的顶点作为集合
【发布时间】:2012-04-28 23:45:31
【问题描述】:

GraphDb 端

顶点:用户

边缘:有

顶点:汽车

对象侧

public class User {  
    public string Name { get; set; }

    [GraphEdge("HAS_CAR")]
    public ICollection<Car> Cars { get; set; }
}

问题

我想通过 Gremlin 从 Neo4J 获取具有 Cars 属性的用户 X? (我使用的是 Neo4jClient)

Linq to Entity 的 Include 方法太像了..

最好的问候

【问题讨论】:

    标签: graph neo4j gremlin neo4jclient


    【解决方案1】:

    假设如下图:

    您可以使用这样的 Gremlin 查询来检索所有用户的所有汽车:

    g.v(0).out('HAS_USER').out('HAS_CAR')
    

    现在,让我们将其过滤到红色汽车:

    g.v(0).out('HAS_USER').out('HAS_CAR').filter { it.Color == "Red" }
    

    最后,您需要的是用户而不是汽车。最容易想到 Gremlin 就像一个真正的 gremlin(小生物)一样工作。你告诉他跑到用户那里,然后跑到每辆车,然后检查每辆车的颜色。现在你需要他回到他来自的用户那里。为此,我们在查询中添加一个标记,如下所示:

    g.v(0).out('HAS_USER').as('user').out('HAS_CAR').filter { it.Color == "Red" }.back('user')
    

    用 Neo4jClient 用 C# 编写这个非常相似:

    graphClient
        .RootNode
        .Out<User>(HasUser.TypeKey)
        .As("user")
        .Out<Car>(HasCar.TypeKey, c => c.Color == "Red")
        .BackV<User>("user")
    

    这里唯一的区别是您需要分别对边和顶点使用BackEBackV,而不仅仅是Back。这是因为在 C# 的静态类型世界中,我们需要使用不同的方法名称才能返回不同的枚举器类型。

    希望对您有所帮助! :)

    -- 泰坦

    【讨论】:

    • 我更新了问题。因为出生在微软这边,所以我很倒霉。我们没有“Spring Data Neo4j”。也许这是一个小对象图映射问题。我想从 Neo4j 获取带有加载 Cars 属性的用户对象。我怎样才能透明地做到这一点? GraphEdgeAttribute?
    • 好的,现在我更好地理解了你的问题。我会写另一个答案。
    【解决方案2】:

    奥古兹,

    既然你已经更新了这个问题,我就更明白了。

    GraphEdgeAttribute 不是 Neo4jClient 的一部分,所以我不确定它来自哪里。

    在 Neo4jClient 中,我们不加载深层对象。也就是说,我们不会遵循属性并加载更多集合。我们这样做是因为 a) 它需要我们对服务器进行大量往返,并且 b) 我们认为您应该明确说明您实际想要加载的数据。我们不想成为 Neo4j 项目的 Spring Data 的等价物,因为我认为这不是一个好方法。

    听起来您可能想看看 Cypher 而不是 Gremlin。这将允许您将数据加载为表格,包括来自多个节点的投影。

    -- 泰坦

    【讨论】:

    • 我正在“按设计”得到你的答案 :) 非常感谢。我将其设置为“已接受的答案”。 GraphEdgeAttribute 是我的功能建议。我试图在 linq to entity,db4o 中找到这个特性。在密码方面,将 Nodes-Relations (Classes-RelatedProperties) 作为 Table 并将它们再次转换为 back 对象没有任何意义。必须有更好的方法:
    • graphClient .RootNode .Out(HasUser.TypeKey) .LoadOut(HasCar.TypeKey,c=>c.Color=="Red").AsProperty("Cars")
    • 或 graphClient.RootNode.Out(HasUser.TypeKey).LoadProperty("Cars",node=>node.Out(HasCar.TypeKey)) 这可能更好:)是的,这个解决方案不需要 GraphAttribute。
    • a) 真正的往返是分别获取用户和用户的汽车 b) 我的解决方案没有问题,我明确表示获取用户节点和相关的汽车节点
    • 我们给自己的另一个设计要求是我们镜像 Gremlin API。我很犹豫(但不完全反对)添加额外的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多