2
votes

I'm working on a webapp running on Tomcat which using spring-data to connect to a neo4j graph in embedded mode. I would like to use neo4j server instead of the embedded mode and I am looking for some help to be sure about how to do that. Some of my application services are quite difficult and combine, in a single transaction, the result of several cypher requests in a dto sent back to the user.

First I thought that I have to create a server unmanaged extension and I think I should follow these following steps. - Keep my webapp with springMVC and spring security to hold and secure users sessions. - Regroup all my transactional services in a specific jar my-app.jar - Use Jax-RS to add a REST access point on each of my service of my-app.jar - use something like spring restTemplate from my spring controller to call services from my-app.jar

First question : is this way of doing things is the good way ? Second question : I have many spring injection in my services layer. How can I keep them working (how can I add dependencies in the server extension ?

Then I discovered graphAware and I wonder if I should use it instead.

And finally I just read this post http://jexp.de/blog/2014/12/spring-data-neo4j-improving-remoting-performance/ and it seems that I should use the SpringCypherRestGraphDatabase (as explain in the bold text at the end of the article).

Well, I'm a little bit lost and I would appreciate any help to use neo4j server instead the embedded mode for my application which contain some complexe transactions.

2

2 Answers

3
votes

You have a number of options here and you are on the right track with your thinking.

Option 1:

If your use cases are business-logic-heavy, and your question suggests that they are, going the unmanaged extension route is one option.

Essentially, you can then combine the most performant Java API and Cypher (if you wish) to perform your use case. I wouldn't use SDN here by the way, so you have to do your mapping manually, but is there really any mapping? Maybe you just want to execute traversals / Cypher queries for each one of your use cases.

Each use case then exposes a simple REST API, which is consumed by your Spring-powered application running Spring MVC, Spring Security, and all that. You can use the RestTemplate from Spring in your app's Controllers.

To add a twist to all that, you can use the GraphAware Framework to develop the "unmanaged extension" using Spring MVC as well. That would be my preferred option, knowing nothing about your domain/app.

Option 2:

Use the new version of SDN (v4) as Michael suggests. This allows you to run your application with annotated domain objects, Spring MVC, Security, et al. Operations (CRUD and other) are automatically translated to Cypher and sent across the wire to Neo4j running in server mode (no extensions needed). Results are then marshalled back to Java objects.

We're about to release Milestone 1 of SDN v4. It shouldn't take more than a week. That said, it is still going to be a Milestone release, thus not ready for production. A GA release is expected in May (ish).

You can already try SDN v4 yourself. Clone this repo: https://github.com/spring-projects/spring-data-neo4j, make sure you're on the 4.0 branch, and do an mvn clean install on it. Here's a sample app, built using Angular JS and Spring Boot.

Please do get in touch with feedback / questions / problems (best by email info at graphaware dot com). Cheers!

0
votes

I suggest you wait a bit until SDN4 Milestone 1 comes out (developed by GraphAware) this was written from scratch for Neo4j-Server.