0

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 方法非常相似。

此致

4

2 回答 2

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")

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

我希望这会有所帮助!:)

——泰坦

于 2012-04-29T23:07:55.123 回答
0

奥古兹,

既然您已经更新了问题,我就更好地理解了。

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

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

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

——泰坦

于 2012-04-30T02:31:56.423 回答