Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connecting to neo4j using ColdFusion

Has anyone here successfully connected to neo4j using ColdFusion?

I was able to connect to neo4j 1.6.1 using this guide as a starting point: http://ghostednotes.com/2010/04/29/using-neo4j-graph-databases-with-coldfusion . However, it was a short lived success. I have since uninstalled neo4j 1.6.1 and installed 1.7.

I am now running Apache, CF 9.0.1 on windows XP as a local dev box. I added ...\neo4j-community-1.7\lib to my CF class path and the libraries are listed in CF Server Java Class Path. neo4j is running fine, as I can use their administrator interface: http://localhost:7474/webadmin/# . CF and Apache are also running fine. I use them daily.

While the code below works, I'd really like to 'see' what's going on using the neo4j web admininistrator. So I can coordinate my learning neo4j while using the data in a CF application.

Code: (Works)

    dbroot = "/tmp/neo4jtest1/";
    graphDb = createObject('java', 'org.neo4j.kernel.EmbeddedGraphDatabase');
    graphDb.init( dbroot & 'var/myFirstGraphDB');

So I tried to connect to the neo4j db graph.db . However the code fails.

Code: (fails)

    graphDb = createObject('java', 'org.neo4j.kernel.EmbeddedGraphDatabase');
    graphDb.init( dbroot & 'graph.db');

Error:

    Object instantiation exception.
    An exception occurred while instantiating a Java object. The class must not be an interface or an abstract class. Error: ''. 

If I remove the "." in graph.db it does create a "graphdb" in the neo4j data folder, and successfully connects to it. However, that db is not viewable with their admin :(

I'm a novice, so please dumb down your answer.

like image 311
j-p Avatar asked Apr 20 '12 17:04

j-p


2 Answers

Ok, I think what you're trying to achieve is not possible. It is not possible to access Neo4J within CF (via Java) and have the admin interface working (caveat 1 applies).

If you have put all the jars of the Neo4J package into Adobe CF then most likely the Neo4J admin interface is looking at it's own Neo4J file system. When you create the Embedded server it is not connecting to the same database because it simply can't.

Embedded Neo4J doesn't work like a standard database connection. One Embedded Neo4J reads and writes to one directory location (key word: directory, it doesn't open a single file but a whole bunch of them). No two Neo4J instances can access the same directory location (caveat 2 applies).

Ok, the caveats:

1- it is possible, in theory, to manually start up the admin interface programatically so that it uses the Embedded server that you create via Java. The Java code looks simple enough (taken from Using the server (including web administration) with an embedded database):

// Create your embedded graph db somewhere
src = CreateObject("java", "org.neo4j.server.WrappingNeoServerBootstrapper")
      .init(graphDb);
srv.start();
// The server is now running
// until we stop it:
srv.stop();

I did not get this working, mostly because the admin server hasa bunch of dependencies that were incompatible with the rest of my setup, so I can't advise on how well the above will work.

2- it is possible to have 1 read/write Neo4J accessing one location and then have multiple read-only Neo4Js (EmbeddedReadOnlyGraphDatabase) reading the same location (but I've never tried it).

You do have the option of using the REST interface - either manually, or via the Neo4J Java REST Binding (kinda slow, though).

It might be worth reading the Deployment Scenarios documentation before getting too deep in this.

There is at least one CF/Neo4J bridge out there, but it's pretty incomplete. I have one that I worked on, but I need to figure out if I can open source it!

like image 160
otupman Avatar answered Oct 23 '22 13:10

otupman


Just a small addition to otupman's comments. I can confirm his theory of connecting to the admin interface from CF. Adding the following jars to the CF class path seemed to be enough to get the basics up and running. You may need additional jars if you are using more advanced features. Note, I am using Tomcat so the exact jars may differ slightly for your environment

  • neo4j-community-1.7/lib/*.* (entire directory)
  • neo4j-community-1.7/system/lib: (ONLY the jars below)

    • asm-3.1.jar
    • asm-analysis-3.2.jar
    • asm-commons-3.2.jar
    • asm-tree-3.2.jar
    • asm-util-3.2.jar
    • commons-configuration-1.6.jar
    • jackson-core-asl-1.8.3.jar
    • jackson-jaxrs-1.8.3.jar
    • jackson-mapper-asl-1.8.3.jar
    • jersey-core-1.9.jar
    • jersey-multipart-1.9.jar
    • jersey-server-1.9.jar
    • jetty-6.1.25.jar
    • jetty-util-6.1.25.jar
    • neo4j-server-1.7-static-web.jar
    • neo4j-server-1.7.jar
    • rrd4j-2.0.7.jar

Then started the server and database in onApplicationStart

    factory = createObject("java", "org.neo4j.graphdb.factory.GraphDatabaseFactory");
    dbroot = ExpandPath("/neo4jtest/");
    graphDb = factory.newEmbeddedDatabase(dbroot & 'myFirstGraphDB');

    Bootstrapper = createObject("java", "org.neo4j.server.WrappingNeoServerBootstrapper");
    graphServer = Bootstrapper.init( graphDb );
    graphServer.start();

    application.graphServer = graphServer;
    application.graphDb = graphDB;

And closed both in onApplicationEnd

    application.graphDb.shutDown();
    application.graphServer.stop();

Edit: After some further testing, I think is better to load them once in OnServerStart. Then use a shutdown hook to close them. But since this is just for a local development box, it is less critical.

like image 2
Leigh Avatar answered Oct 23 '22 12:10

Leigh