1

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

谢谢。

4

3 回答 3

3

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

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

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

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

于 2013-04-26T03:00:48.590 回答
1

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

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

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

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

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

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

于 2013-04-25T19:30:16.733 回答
1

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

于 2013-04-26T06:51:14.160 回答