10

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

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

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

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

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

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

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

感谢您的时间和想法,

TP

4

2 回答 2

7

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

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

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

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

我们在具有约 60k 用户和约 10^6 rels 的生产应用程序中使用该插件的先前版本。由于保密协议,我无法提供更多细节。

于 2012-05-20T17:12:02.510 回答
0

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

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

使用这种方法我们还没有遇到任何问题。我们最喜欢的是,我们事先不知道如何建模的数据,以您事先知道的数据存储方式存储,使数据实际匹配选择的模型,在使用任何其他类型的(非图)数据库时很难做到。

于 2013-11-16T07:45:17.140 回答