2012-04-20 30 views
5

¿Alguien se ha conectado con éxito a neo4j con ColdFusion?Conexión a neo4j con ColdFusion

Pude conectarme a neo4j 1.6.1 utilizando esta guía como punto de partida: http://ghostednotes.com/2010/04/29/using-neo4j-graph-databases-with-coldfusion . Sin embargo, fue un éxito efímero. Desde entonces he desinstalado neo4j 1.6.1 e instalado 1.7.

Ahora estoy ejecutando Apache, CF 9.0.1 en Windows XP como un cuadro dev local. Agregué ...\neo4j-community-1.7\lib a mi ruta de la clase CF y las bibliotecas están enumeradas en la ruta de la clase Java de CF Server. neo4j está funcionando bien, ya que puedo usar su interfaz de administrador: http://localhost:7474/webadmin/#. CF y Apache también funcionan bien. Los uso a diario.

Mientras que el siguiente código funciona, me gustaría 'ver' lo que está pasando con el administrador web neo4j. Entonces puedo coordinar mi aprendizaje de neo4j mientras uso los datos en una aplicación de CF.

Código: (Obras)

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

así que traté de conectar con el graph.db Neo4j db. Sin embargo, el código falla.

Código: (falla)

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: ''. 

Si quito el "." en graph.db que no crear un "graphdb" en la carpeta de datos Neo4j , y se conecta con éxito a ella. Sin embargo, que DB no es visible con su administrador :(

Soy un novato, así que por favor embrutecer su respuesta.

+0

Entonces, el problema básico es que puede crear un archivo graphdb pero no puede crear uno con la extensión .db ¿eh? Y el error ocurre en el init(). Eso indicaría que la "clase" es una requerida por el init. ¿Hay quizás un argumento de "extensión" que deberías aprobar? el ejemplo al que hace referencia no incluye .db en él. –

+0

No estoy seguro Mark - en este punto estoy tratando de establecer un paralelismo entre conectarme a un DSN y darle una consulta - a las necesidades de neo4j ... curiosamente, algo le pasó a ESA conexión graphdb, TOO es ahora lanzando ese error ... si simplemente agrego un "2" entonces voy a "graphdb2" - crea una nueva carpeta de base de datos, etc., y se opone con éxito - Pero estoy seguro de que eso también cambiará: Conseguir constantemente 'bloqueado' o algo así - Simplemente no sé lo suficiente como para saber por qué ... – jpmyob

Respuesta

4

Ok, creo que lo que estamos tratando de lograr no es posible. Es no es posible acceder a la Neo4J dentro CF (a través de Java) y tienen la interfaz de administración de trabajo (salvedad 1 se aplica).

Si usted ha puesto todos los frascos del paquete Neo4J en Adobe CF entonces lo más probable es que la interfaz de Neo4J de administración está mirando su propio sistema de archivos Neo4J. Cuando crea el servidor incrustado no se conecta a la misma base de datos porque simplemente no puede.

Neo4J integrado no funciona como una conexión de base de datos estándar. One Embedded Neo4J lee y escribe en una ubicación de directorio (palabra clave: directorio, no abre un solo archivo, sino un montón de ellos). No hay dos instancias de Neo4J que puedan acceder a la misma ubicación de directorio (se aplica la advertencia 2).

Ok, las advertencias:

1- es posible, en teoría, para iniciar manualmente la interfaz de administración mediante programación para que utilice el servidor Embedded que se crea a través de Java.El código Java se parece bastante simple (tomado de 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(); 

no he tenido este trabajo, sobre todo porque el servidor de administración hasa montón de dependencias que eran incompatibles con el resto de mi configuración, por lo que no puede asesorar sobre qué tan bien funcionará lo anterior.

2- es posible tener 1 lectura/escritura de Neo4J accediendo a una ubicación y luego tener múltiples Neo4Js de solo lectura (EmbeddedReadOnlyGraphDatabase) leyendo la misma ubicación (pero nunca lo he probado).

Tiene la opción de utilizar la interfaz REST, ya sea manualmente, o a través del Neo4J Java REST Binding (algo lento, sin embargo).

Puede valer la pena leer la documentación de los escenarios de implementación antes de profundizar en esto.

Hay al menos un puente CF/Neo4J por ahí, pero está bastante incompleto. Tengo uno en el que trabajé, pero necesito averiguar si puedo abrirlo.

+0

+1. Gran explicación Usando tus consejos, confirmé que el # 1 funciona. – Leigh

+0

hum - parece haber alguna confusión - probablemente es mi culpa ... ne04j viene con un administrador web - pero no estoy tratando de vincularlo con el webadmin per'se - Id simplemente me gusta usar el webadmin para "ver" lo que tengo en el db me he conectado usando CF ... Quizás esto sea más una pregunta de neo4J - que una pregunta de CF ... ya que parezco ser capaz de crear e insertar datos a través de CF ... Tengo mucho cariño para sacar datos relacionados ... pero ahora solo me gustaría 'ver' los datos a través de los 'ojos' de 'webadmin' para poder confirmar visualmente que está entrando correctamente. – jpmyob

+1

En casi cualquier implementación de Neo4J, hacer que el webadmin vea los datos de su base de datos Neo4J solo se puede hacer a través de una de las dos formas anteriores. – otupman

2

Una pequeña adición a los comentarios de otupman. Puedo confirmar su teoría de conexión a la interfaz de administración de CF. Agregar los siguientes archivos jar a la ruta de la clase CF parecía ser suficiente para poner en marcha los conceptos básicos. Es posible que necesite frascos adicionales si está utilizando funciones más avanzadas. Nota, estoy usando Tomcat para los frascos exactos pueden diferir ligeramente de su entorno

  • neo4j-community-1.7/lib/*.* (directorio completo)
  • neo4j-community-1.7/system/lib: (en vasijas de debajo)

    • 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-configuración-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-multiparte-1.9.jar
    • jersey-server-1.9.jar
    • embarcadero-6.1.25.jar
    • embarcadero-util-6.1.25.jar
    • Neo4j-server-1,7-static-web.jar
    • Neo4j-server-1.7.jar
    • rrd4j-2,0 .7.jar

Luego comenzó el servidor y base de datos en 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; 

y cerrado tanto en onApplicationEnd

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

Editar: Después de algunas pruebas más, creo que es mejor para cargarlos una vez en OnServerStart. Luego usa un gancho de apagado para cerrarlos. Pero dado que esto es solo para una caja de desarrollo local, es menos crítico.