构建基于 Neo4j 的应用程序 - 坚持使用普通节点和关系的普通 API,还是使用 Spring/GORM?



我希望听到你们中任何已经构建和实现了一个体面的Neo4j应用程序(10的数百万节点/rels(的人 - 以及您的建议,特别是w.r.t建模和各种API(vanilla java/groovy Neo4j vs Spring-Data-Neo4j vs Grails GORM/Neo4j(。

我很感兴趣,添加额外的 OGM(对象-图形映射(层和相关抽象是否真的值得?

有没有人的经验是,最好坚持使用节点+属性,关系+属性,遍历和(例如(密码来建模和存储他们的数据的"普通"图形建模?

我担心的是,将特定的OGM抽象"强制"到图形数据库上会影响未来适应/更改域模型的灵活性和/或查询数据的灵活性。

我们是一家Grails商店,我已经尝试了GORM/Neo4J以及spring-data-neo4j。

该数据集的主要目的是对大量人、他们的别名、他们的同伙以及各种犯罪活动和历史之间的关系进行建模和查询。将有50多个主要领域类。模型必须具有灵活性(需要在项目的早期阶段快速发展(以及查询的速度和灵活性。

必须承认,当我可以使用(例如(POJO或POGO,一点Groovy魔法和一些简单的手动卷制域对象<->节点/关系映射代码时,我正在努力寻找一个令人信服的理由来使用OGM层。据我所知,我想我会很高兴只处理节点和遍历和密码(又名KISS(。但是,我很高兴听到其他人的经验和建议。

感谢您的时间和想法,

卫生纸

因为我是Grails Neo4j插件的作者,所以我可能有偏见。创建插件的主要原因是将Grails域类的易用性及其强大的开箱即用脚手架应用于Neo4j,用于~80%的用例。对于另外20%的特定需求需要遍历等东西,我们直接使用Neo4j API(遍历/密码(,不使用GORM API。

当前版本的 Neo4j 插件存在超级节点问题,因为每个域实例都连接到一个子引用节点。如果多个并发请求(也称为线程(添加新的域实例,则有可能出现锁定异常。我将通过子引用方法或使用索引来解决这个问题。

Cypher也可以在Neo4j Grails插件中使用。

另一方面,Spring-Data-Neo4j是一种更高级的方法,可以更精细地控制映射细节,但需要使用特定的注释。我发现没有简单的方法可以像脚手架一样将其集成到Grails中。

我们正在一个具有 ~60k 用户和 ~10^6 个版本的高效应用程序中使用该插件的前身版本。由于保密协议,我无法提供有关此的更多详细信息。

我们不使用grails,但使用混合的普通neo4j/spring-data-neo4j解决方案。原因是我们的一些域数据具有固定的架构,而有些则没有。SDN减轻了很多负担,如果需要,可以与普通的neo4j混合使用。

我们有描述数据模型的类,这些类的对象我们使用SDN持久化,没有额外的技巧,我们只使用SDN的基础知识。然后我们有类,其中包含事先不知道的模型数据。这些存储在节点中,包含用于描述数据引用的模型类型的特殊属性。当neo4j 2发布时,我们可能会将这些信息移动到标签中。在这些节点之间可以存在关系,也由上述由 sdn 管理的数据模型描述。我们也有从通用节点到 SDN 节点的关系,这工作正常,因为所有内容最终都是相同的东西:节点。

使用此方法时,我们尚未遇到任何问题。我们最喜欢的事情是,我们事先不知道它将如何建模的数据,以您希望存储数据的方式存储,而您事先知道它,使数据实际上与所选模型匹配,这在使用任何其他类型的(非图形(数据库时都很难做到。

最新更新