Neo4j嵌入式模式使用GDS



我正试图将GDS 1.8.2作为运行嵌入式Neo4j 4.4.3服务器的系统的一部分。嵌入式服务器和Neo4j的几个版本已经作为一个操作组件使用了几年,因此该组件本身经过了时间测试,功能非常好。这是第一次尝试将对图形算法的支持添加到该组件中。

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

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

在实现这一点的过程中,我发现我必须在图形数据库的GlobalProcedures注册表中注册org.neo4j.gds.catalog.GraphCreateProc类。这似乎是成功的,因为当我最初遇到CQL异常,说gds.graph.create过程未知时,现在它似乎毫无例外地执行。然而,我现在看到事务没有生成命名图(通过使用开箱即用的Neo4j社区版服务器模式检查图数据库进行验证(。它可能只运行0.1秒(而在Neo4j社区版服务器模式下运行几秒,效果很好(。

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

有人能解释一下为什么gds.graph.create过程在执行时似乎没有异常,但不知何故却被标记为READ_ONLY事务吗?这就是为什么命名图没有被创建的原因吗?

感谢您的建议或提示!如果有人有探索性的问题,我很乐意提供更多的细节,这可能有助于挖掘问题的根本原因。

为我自己的问题提供答案,因为这是在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在嵌入式模式下工作的文档。

最新更新