2012-04-20 3 views
5

Qualcuno è riuscito a connettersi a neo4j con ColdFusion?Connessione a neo4j tramite ColdFusion

Sono stato in grado di connettersi a neo4j 1.6.1 utilizzando questa guida come punto di partenza: http://ghostednotes.com/2010/04/29/using-neo4j-graph-databases-with-coldfusion . Tuttavia, è stato un successo di breve durata. Da allora ho disinstallato neo4j 1.6.1 e installato 1.7.

Ora sto eseguendo Apache, CF 9.0.1 su Windows XP come scatola di sviluppo locale. Ho aggiunto ...\neo4j-community-1.7\lib al mio percorso di classe CF e le librerie sono elencate nel percorso classe Java di CF Server. neo4j sta funzionando bene, dato che posso usare la loro interfaccia amministratore: http://localhost:7474/webadmin/#. Anche CF e Apache funzionano bene. Li uso tutti i giorni.

Mentre il codice seguente funziona, mi piacerebbe davvero "vedere" cosa sta succedendo usando l'amministratore del web neo4j. Quindi posso coordinare il mio apprendimento neo4j mentre uso i dati in un'applicazione CF.

Codice: (Opere)

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

Così ho provato a connettersi al graph.db Neo4j db. Tuttavia il codice non funziona.

Codice: (non)

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

Errore:

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

se mi tolgo la "." in graph.db esso non creare un "graphdb" nella cartella dei dati Neo4j e si collega con successo ad esso. Tuttavia, che db non è visualizzabile con il loro amministratore :(

Sono un novizio, quindi per favore dumb down vostra risposta.

+0

Quindi il problema di base è che è possibile creare un file graphdb ma non è possibile crearne uno con estensione .db eh? E l'errore si verifica su init(). Ciò indicherebbe che la "classe" è quella richiesta da init. C'è forse un argomento di "estensione" che dovresti passare? l'esempio di riferimento non include .db in esso. –

+0

Non sono sicuro che Mark - a questo punto sto cercando di tracciare paralleli tra la connessione a un DSN e l'invio di una query - al neo4j ha bisogno ... interessante, qualcosa è successo a THAT graphdb connection, TOO è ora lanciando quell'errore ... se aggiungo semplicemente un "2" quindi vado a "graphdb2" - crea una nuova cartella DB ecc, e opporizza con successo - Ma sono sicuro che cambierà anche - il suo ottenendo costantemente 'bloccato' o qualcosa del genere - non so abbastanza per sapere perché ... – jpmyob

risposta

4

Ok, penso che quello che stai cercando di ottenere non è possibile. E ' non è possibile accedere Neo4j entro CF (tramite Java) e hanno l'interfaccia di amministrazione di lavoro (caveat 1 si applica).

Se avete messo tutti i vasi del pacchetto Neo4j in Adobe CF quindi molto probabilmente l'interfaccia Neo4j di amministrazione sta guardando il proprio file system Neo4J. Quando crei il server Embedded non si connette allo stesso database perché semplicemente non lo è.

Neo4J incorporato non funziona come una connessione di database standard. One Embedded Neo4J legge e scrive in una directory (parola chiave: directory, non apre un singolo file ma un gruppo completo di essi). Nessuna due istanze Neo4J può accedere allo stesso percorso di directory (si applica l'avvertenza 2).

Ok, i caveat:

1- è possibile, in teoria, per avviare manualmente l'interfaccia di amministrazione programatically in modo che utilizzi il server incorporato che si crea tramite Java.Il codice Java sembra essere abbastanza semplice (tratto da 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(); 

non ho avuto questo lavoro, soprattutto perché l'amministratore del server Hasa mucchio di dipendenze che erano incompatibili con il resto della mia messa a punto, in modo da non posso consigliare su quanto bene funzionerà.

2- è possibile avere 1 lettura/scrittura Neo4J che accede a una posizione e quindi dispone di più Neo4J di sola lettura (EmbeddedReadOnlyGraphDatabase) che leggono la stessa posizione (ma non l'ho mai provato).

Si ha la possibilità di utilizzare l'interfaccia REST - manualmente o tramite lo Neo4J Java REST Binding (un po 'lento, comunque).

Potrebbe essere utile leggere la documentazione degli scenari di distribuzione prima di approfondire.

C'è almeno un bridge CF/Neo4J, ma è piuttosto incompleto. Ne ho uno su cui ho lavorato, ma ho bisogno di capire se posso aprirlo!

+0

+1. Ottima spiegazione. Usando i tuoi suggerimenti ho confermato che il # 1 funziona. – Leigh

+0

ronzio - sembra esserci un po 'di confusione - probabilmente è colpa mia ... ne04j viene fornito con un amministratore web - ma non sto cercando di collegarmi al webadmin per'se - Id proprio come usare il webadmin per "vedere" quello che ho nel db che ho collegato usando CF ... Forse questa è più una domanda neo4J - che una domanda CF ... come mi sembra di essere in grado di creare e inserire dati tramite CF .. Ho un sacco di informazioni sull'ottenimento di dati correlati OUT ... ma in questo momento vorrei solo "vedere" i dati attraverso gli "occhi" del "webadmin" così posso confermare visivamente che sta andando IN – jpmyob

+1

In quasi tutte le distribuzioni Neo4J, ottenere la webadmin per vedere i dati del tuo database Neo4J può essere fatto solo attraverso uno dei due modi sopra. – otupman

2

Solo una piccola aggiunta ai commenti di otupman. Posso confermare la sua teoria del collegamento all'interfaccia di amministrazione da CF. Aggiungere i seguenti jar al percorso della classe CF sembrava essere sufficiente per ottenere le basi operative. Potresti aver bisogno di barattoli aggiuntivi se stai utilizzando funzionalità più avanzate. nota, sto usando Tomcat in modo che i vasi esatte possono differire leggermente per l'ambiente

  • neo4j-community-1.7/lib/*.* (tutta la directory)
  • neo4j-community-1.7/system/lib: (SOLO i barattoli sotto)

    • asm-3.1 .jar
    • asm-analisi-3.2.jar
    • ASM-commons-3.2.jar
    • asm-tree-3.2.jar
    • asm-util-3.2.jar
    • scorta-configurazione-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
    • molo-6.1.25.jar
    • molo-util-6.1.25.jar
    • Neo4j-server-1.7-static-web.jar
    • Neo4j-server-1.7.jar
    • rrd4j-2.0 .7.jar

Poi ha iniziato il server e il 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; 

e chiuso sia in onApplicationEnd

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

Edit: Dopo qualche ulteriore prova, penso che è meglio per caricarli una volta in OnServerStart. Quindi utilizzare un gancio di arresto per chiuderli. Ma poiché questo è solo per una scatola di sviluppo locale, è meno critico.