【问题标题】:Neo4j - Wrapping/Inheriting a Node objectNeo4j - 包装/继承节点对象
【发布时间】:2013-04-19 18:17:05
【问题描述】:

我正在使用 neo4j 开发一种社交网络,并且我想让我的 Node 对象更具体地满足我自己的需求。包装 neo4j Node 对象或继承它是否被认为是一种好习惯? 当使用内置 Lucene 引擎索引节点对象时,会出现包装方法的问题。例如,如果我将我的Node 对象包装为“Profile”类(使用“addFriend”、“setFirstName”等方法),我将获得什么好处,但另一方面,每当我将对我的索引运行查询我会得到原始的Node 对象而不是我的包装对象?通过在我的节点属性中保存包装对象的引用,我可以为这种情况做一些肮脏的解决方案,但这样做对我来说看起来很奇怪。 在这种情况下,为了获得干净且设计良好的代码,您会建议做什么?

谢谢。

【问题讨论】:

    标签: lucene indexing neo4j


    【解决方案1】:

    我发现包装节点不会导致非常可维护的代码/设计。正如您所提到的,您需要注意的一件事不是返回节点,而是将其转换为您的域对象。

    如果您的对象主要有 getX 方法,那么您只需执行 Cypher 查询,组合您的域对象并返回这些方法。在这种情况下,您甚至不需要包装节点 - 您所需要的只是一些可用于查找节点的属性。

    如果您有 setX 方法,那么您可以通过 Cypher 语句更新节点,或者通过更新所有属性的保存或在每个 setX 上(不太好,因为您会经常更新 setX 方法现在意味着持久性)。这两种方法中的任何一种都不需要包装节点。

    我在早期的项目中尝试过对 Node 进行封装,但发现它会带来更多的麻烦,而且设计通常很臭。现在我使用纯域 POJOS 并将 Neo4j 代码仅保留在持久层中,这对我来说效果更好。你还没有提到你使用的是哪种语言——如果是 Java,那么我相信 Spring Data 可以处理很多样板代码。

    【讨论】:

      【解决方案2】:

      将您的搜索代码放入他们所属的类中。

      如果你需要,我不知道,从 Post 类中获取类似 getFriends 的东西,你将在 Person 类中创建 fromPosts 方法,在 Post 中创建 getFriends 方法。

      从帖子中,您将从 Person 类调用查询,执行查询并返回映射到 Person 类的节点的数组/列表。

      因此,您在 Post 类中的 getFriends 方法将类似于:

      Person.fromPosts(self).results.map { |node| Person.new(node) }

      这样做很简单,只需使用 Person.new(或新的 Person,取决于您使用的语言)将结果映射并将节点传递给 Person。这意味着您必须有一个从节点填充对象的新方法。

      【讨论】:

      • 我看不出它如何解决我的设计问题...我的查询结果仍然是节点类型,这不会给我额外的信息。如果我有不同类型的节点怎么办?我希望能够索引我的包装类,而不是底层的 Node 类型。
      • 你的意思是你想做一个从不同类返回不同对象的查询?
      • 是的。我看到 Index 类是通用的,主要用作 Index。包装/继承节点类并将其用作 Index 类的通用参数是否被认为是一种好习惯?
      【解决方案3】:

      Spring Data Neo4j 是满足您需求的最终解决方案,它将带注释的实体类映射到具有高级映射功能的 Neo4j,并提供对不同抽象级别的节点和关系的访问。

      【讨论】:

        猜你喜欢
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        • 2012-01-05
        • 2011-10-08
        相关资源
        最近更新 更多