我正在使用neo4j开发一种社交网络,我想让我的Node
对象更具体地满足我自己的需求。包装neo4j Node
对象或从中继承对象是否被认为是一种好习惯?
当使用内置的Lucene引擎索引节点对象时,出现了包装方法的问题。例如,如果我将Node
对象包含在“Profile”类中(使用诸如“addFriend”,“setFirstName”等方法),我将获得什么好处,但另一方面,每当我将对我的索引运行查询时,我将返回原始Node
对象而不是我的包装对象?我可以通过在我的节点属性中保存包装对象的引用来为这种情况制作一些脏的解决方案,但对我来说这看起来很奇怪。
在这种情况下,您会建议做什么,以获得干净且设计良好的代码?
感谢。
答案 0 :(得分:3)
我发现包装节点不会导致代码/设计非常易于维护。正如您所提到的,您需要注意的一件事是不返回节点,而是将其转换为您的域对象。
如果你的对象主要是getX方法,那么你可以只执行Cypher查询,编写你的域对象并返回它们。在这种情况下,您甚至不需要包装节点 - 您只需要一些可用于查找节点的属性。
如果您有setX方法,那么您可以通过更新所有属性的保存或每个setX上的Cypher语句更新节点(不是很好,因为您经常更新setX方法现在意味着持久性)。这两种方法都不需要包装节点。
我在之前的项目中试图包装Node,但发现它会导致更多的麻烦和一般的臭设计。现在我使用纯域POJOS并仅将Neo4j代码保留在持久层中,这对我来说效果更好。你还没有提到你正在使用哪种语言 - 如果是Java,那么我相信Spring Data可以处理很多样板代码。
答案 1 :(得分:1)
将您的搜索代码放入他们所属的班级。
如果您需要获取,我不知道,像Post类中的getFriends,您将创建方法fromPosts到Person类,并将getFriends方法创建到Post。
从post开始,您将从Person类调用查询,执行查询并返回映射到Person类的节点的Array / List。
所以你的getFriends方法进入Post类就像:
Person.fromPosts(self).results.map {| node | Person.new(node)}
使用Person.new(或新Person,取决于您使用的语言)只做一个结果映射并将节点传递给Person很简单。这意味着您必须拥有一个从节点填充对象的新方法。
答案 2 :(得分:1)
Spring Data Neo4j是您需要的最终解决方案,它使用高级映射功能将带注释的实体类映射到Neo4j,并提供对不同抽象级别的节点和关系的访问。