作为Grails Neo4j插件的作者,我可能有偏见。创建该插件的主要原因是将Grails领域类的易用性和强大的开箱即用脚手架应用于Neo4j的约80%的使用情况。对于另外20%需要遍历等特定需求的情况,我们直接使用Neo4j API(遍历/ Cypher),而不使用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节点的关系,这很好用,因为所有东西最终都成为相同的事物:节点。
使用这种方法,我们尚未遇到任何问题。我们最喜欢的是,我们事先不知道如何对数据进行建模的数据以您希望在预先了解它时存储数据的方式进行存储,使得数据实际匹配所选的模型,当使用其他类型的(非图形)数据库时,这是非常难做到的。