【问题标题】:Connecting to neo4j using ColdFusion使用 ColdFusion 连接到 neo4j
【发布时间】:2012-04-20 17:42:33
【问题描述】:

这里有没有人使用 ColdFusion 成功连接到 neo4j?

我能够使用本指南作为起点连接到 neo4j 1.6.1:http://ghostednotes.com/2010/04/29/using-neo4j-graph-databases-with-coldfusion .然而,这是一个短暂的成功。我已经卸载了 neo4j 1.6.1 并安装了 1.7。

我现在在 Windows XP 上运行 Apache、CF 9.0.1 作为本地开发盒。我将...\neo4j-community-1.7\lib 添加到我的CF 类路径中,并且库 中列出在CF Server Java 类路径中。 neo4j 运行良好,因为我可以使用他们的管理员界面:http://localhost:7474/webadmin/#。 CF 和 Apache 也运行良好。我每天都使用它们。

虽然下面的代码有效,但我真的很想“看看”使用 neo4j 网络管理员发生了什么。所以我可以在 CF 应用程序中使用数据的同时协调我学习 neo4j。

代码:(作品)

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

所以我尝试连接到 neo4j db graph.db 。但是代码失败了。

代码:(失败)

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

错误:

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

如果我删除graph.db 中的".",它确实会在neo4j 数据文件夹中创建一个“graphdb”,并成功连接到它。但是,他们的管理员无法查看该数据库:(

我是新手,所以请你的回答低一点。

【问题讨论】:

  • 所以基本问题是你可以创建一个graphdb文件,但你不能创建一个扩展名为.db的文件是吗?并且错误发生在 init() 上。这将表明“类”是 init 所需的。您是否应该传递一个“扩展”论点?您引用的示例中不包含 .db。
  • 我不确定马克 - 在这一点上,我试图在连接到 DSN 和向它提供查询之间画出相似之处 - 满足 neo4j 的需求......有趣的是,那个 graphdb 发生了一些事情连接,它现在也抛出了那个错误......如果我只是添加一个“2”所以我要去“graphdb2” - 它会创建一个新的数据库文件夹等,并成功地进行操作 - 但我相信这会改变太 - 它一直被“锁定”或其他东西 - 我只是不知道为什么......

标签: coldfusion neo4j


【解决方案1】:

好的,我认为您想要实现的目标是不可能的。无法在 CF 中访问 Neo4J(通过 Java)并且让管理界面正常工作(适用警告 1)。

如果您已将 Neo4J 包的所有 jar 放入 Adob​​e CF,那么 Neo4J 管理界面很可能正在查看它自己的 Neo4J 文件系统。当您创建嵌入式服务器时,它不会连接到同一个数据库,因为它根本无法连接。

嵌入式 Neo4J 不像标准数据库连接那样工作。一个嵌入式 Neo4J 读取和写入一个目录位置(关键词:目录,它不会打开单个文件,而是打开一大堆文件)。没有两个 Neo4J 实例可以访问相同的目录位置(适用警告 2)。

好的,注意事项:

1- 从理论上讲,可以通过编程方式手动启动管理界面,以便它使用您通过 Java 创建的嵌入式服务器。 Java 代码看起来很简单(取自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();

我没有得到这个工作,主要是因为管理服务器有一堆与我的其余设置不兼容的依赖项,所以我无法建议上述工作的效果。

2- 可以让 1 个读/写 Neo4J 访问一个位置,然后让多个只读 Neo4J (EmbeddedReadOnlyGraphDatabase) 读取同一位置(但我从未尝试过)。

您确实可以选择使用 REST 接口 - 手动或通过 Neo4J Java REST Binding(虽然有点慢)。

在深入研究之前,可能值得阅读部署场景文档。

那里至少有一个 CF/Neo4J 桥,但还很不完整。我有一个我正在研究的,但我需要弄清楚我是否可以开源它!

【讨论】:

  • +1。很好的解释。使用您的提示,我确认 #1 确实有效。
  • 嗯 - 似乎有些混乱 - 可能是我的错...... ne04j 带有一个网络管理员 - 但我并不想与网络管理员本身联系 - 我只是喜欢使用网络管理员“查看”我在使用 CF 连接到的数据库中得到了什么......也许这更像是一个 neo4J 问题 - 而不是一个 CF 问题......因为我似乎能够创建和插入数据通过 CF ......我在获取相关数据方面有很多缺点......但现在我只想通过“网络管理员”的“眼睛”“看到”数据,这样我就可以直观地确认它会正确进入。
  • 在几乎任何 Neo4J 部署中,只能通过上述两种方式之一让 web 管理员查看 Neo4J 数据库的数据。
  • 扩展我之前的评论:在嵌入式模式下,没有服务器,您的应用程序直接使用图表。再举一个例子,在嵌入式模式下,您无法将 CF 服务器与 Neo4J 分开(因此,在 SQL 术语中,没有 CF 服务器,然后是数据库服务器)。如果您想要客户端/服务器安排,则需要查看 REST 接口或“HA”(高可用性)模式。
【解决方案2】:

只是对 otupman 的 cmets 的一个小补充。我可以确认他从 CF 连接到管理界面的理论。将以下 jar 添加到 CF 类路径似乎足以让基础知识启动并运行。如果您使用更高级的功能,您可能需要额外的 jars。 注意,我使用的是 Tomcat,所以确切的 jars 可能会因您的环境而略有不同

  • neo4j-community-1.7/lib/*.*(整个目录)
  • neo4j-community-1.7/system/lib:(仅限以下罐子)

    • 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

然后在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;

并在 onApplicationEnd 中关闭

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

编辑:经过进一步测试,我认为最好在 OnServerStart 中加载一次。然后使用关闭挂钩关闭它们。但由于这只是针对本地开发框,所以它的重要性不高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多