1

我正在尝试将 GDS 1.8.2 用作运行嵌入式 Neo4j 4.4.3 服务器的系统的一部分。嵌入式服务器作为一个运行组件已经有好几年了,Neo4j 的几个版本,所以这个组件本身已经过时间检验并且功能很好。这是在该组件中添加对图形算法的支持的第一次尝试。

我的第一个测试只是提交一个 CQL 查询:

CALL gds.graph.create("someNamedGraph", ["SomeNodeLabel"], ["SomeRelationshipType"])

在让它工作的过程中,我发现我必须在图形数据库的GlobalProcedures注册表中注册org.neo4j.gds.catalog.GraphCreateProc类。这似乎是成功的,因为虽然我最初遇到 CQL 异常说该过程是未知的,但现在它似乎毫无例外地执行。但是,我现在看到事务没有生成命名图(通过使用开箱即用的 Neo4j 社区版服务器模式检查图数据库来验证)。它只运行了大约 0.1 秒(与通过 Neo4j 社区版服务器模式运行的几秒钟相比,它工作得很好)。gds.graph.create

我现在看到的是查询执行类型(如从执行返回的结果对象中所示)被标记为 READ_ONLY。没有异常、通知等。我已经验证了在同一测试代码中的后续写入事务,它创建了一个简单的节点(作为测试),成功地写入了一个节点,并且 Result 对象提供了该事务的所有验证信息.

谁能建议为什么gds.graph.create过程似乎毫无例外地执行,但不知何故被标记为 READ_ONLY 事务?这甚至是没有创建命名图的原因吗?

感谢您的建议或提示!如果有人有探索性问题可能有助于找出其根本原因,我很乐意提供更多详细信息。

4

1 回答 1

0

为我自己的问题提供答案,因为这是在 Mats Rydberg 的协助下解决的。问题是单独调用不会执行操作。结果必须被迭代。

因此,在嵌入式模式下更合适的方法是:

CALL gds.graph.create("someNamedGraph", ["someNodeLabel"], ["someRelationshipType"]) YIELD graphName

而且,在服务器端:

try(Transaction tx = graphDb.beginTx())
{
    Result resultSet = tx.execute(cql);
    while(resultSet.hasNext())
        resultSet.next();
}

这确实产生了命名图。

对我来说,根本问题是我的原始查询(没有 YIELD 子句)在 neo4j 社区版服务器模式的内置浏览器应用程序中正常工作,这表明幕后发生了一些事情,因此它被混淆为最终是如何工作的。无论如何,问题的解决方案现在已经被理解,并且希望将来会有更多关于使 GDS 专门在嵌入式模式下工作的文档。

于 2022-02-12T15:22:30.333 回答