1

我正在寻找构建一个相对复杂的 Neo4J 应用程序,我打算将其拆分为两个独立的项目,即前端和后端。前端将是 HTML5 并且与此问题无关,后端将具有与 Jersey 的 REST 接口,但我有疑问的是该 REST 接口背后的结构。

Atm,这就是我的设想:

RESTimpl <-DATA-> Service  <-DTO-> Repository <-NODE-> DAO <--> Neo4j Singleton

一般流程是 RESTimpl 接收 JSON 并将其转换为简单的 java 对象,如字符串、int 等,然后将这些对象传递给使用它们创建 DTO 的服务。该 DTO 被传递到存储库,该存储库执行将此类 DTO 写入数据库所需的所有 DAO 调用(一个 DTO 可能需要创建多个节点和关系)。对于 DAO,我正在考虑创建一个 Core API 和 Cypher 实现,它只有非常基本的图形功能,比如创建节点、创建关系、删除节点……基本上对所有存储库都有用的方法。Neo4j 单例将包含我的 GraphDatabaseService 实例和一些配置内容。

这是一个相对复杂的结构,但我希望项目非常模块化。使依赖注入变得容易。(所有内容也将针对接口编写)

但是,互联网上的所有示例都有不同的实现。他们实际上使他们的 DTO 成为 Neo4J 节点的包装器,或者至少将底层节点存储在 DTO 中。但它确实只允许 REST-Service-DAO 结构。

但它不允许我更改存储库实现并将不同的数据库放在应用程序后面。

做我想做的事情的“最正确的方法”是什么?

4

1 回答 1

3

我完全使用了您在上面描述的内容,并且我发现它运行良好(一个项目正在生产中,一个几乎在那里)并且不会混淆问题。我不使用 Spring Data,但它是一个可以考虑的选项。

我已将我的域对象定义为标准 POJO——其中根本没有 Neo4j 的东西。它们的持久性由 DAO 管理,其中主要包含 Cypher 查询,在某些情况下,某些核心 API 工作取决于复杂性。

GraphDatabase 是一个注入的(我有两个上下文——EmbeddedGraph 实现是为生产注入的,而 ImpermanentGraph 是为测试注入的)。使用处理域对象和/或 DTO 的 Jersey 公开 REST 服务。所以 Neo4j 的代码只出现在持久层。有几个通用的方便方法暴露于索引/按索引获取等。

我不会采用 wrap-Node 方式 - 尝试过,但发现它带来了自己的一系列问题,并导致设计有点臭。看起来你在正确的轨道上(至少对我来说)

于 2013-04-26T06:02:50.610 回答