Neo4j嵌入式模式下使用GDS

sczxawaw  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(240)

我正在尝试将GDS 1.8.2作为运行嵌入式Neo4j 4.4.3服务器的系统的一部分。嵌入式服务器已经作为一个操作组件使用了几年,并且有几个版本的Neo4j,因此该组件本身已经经过时间测试,并且运行良好。这是第一次尝试在该组件中添加对图形算法的支持。
我的第一个测试就是提交一个CQL查询:
org.neo4j.gds.catalog.GraphCreateProc
在使其工作的过程中,我发现我必须在graph数据库的GlobalProcedures注册表中注册org.neo4j.gds.catalog.GraphCreateProc类。这似乎已经成功了,因为当我最初遇到一个CQL异常,说gds.graph.create过程未知时,现在它似乎没有异常地执行了。但是,我现在看到事务没有生成指定的图(通过使用开箱即用的Neo4j Community Edition服务器模式检查图形数据库来验证)。(与几秒钟时,通过Neo4j社区版服务器模式,它的工作刚刚好)。
我现在看到的是查询执行类型(如从执行返回的结果对象中所示)被标记为READ_ONLY。没有异常、通知等。我已经验证了同一测试代码中的后续写事务(创建一个简单节点(作为测试))成功地写入了一个节点,并且结果对象提供了该事务的所有验证信息。
有人能解释为什么gds.graph.create过程看起来执行时没有异常,但却被标记为READ_ONLY事务吗?这就是为什么命名图没有被创建的原因吗?
感谢您的建议或提示!如果任何人有探索性的问题,可能有助于挖掘这一问题的根本原因,我很高兴提供更多细节。

zzlelutf

zzlelutf1#

提供了我自己的问题的答案,因为这个问题在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 community edition服务器模式的内置浏览器应用程序中可以正常工作,这表明在幕后有一些事情在发生,以至于它对如何最终工作感到困惑。无论如何,问题的解决方案现在已经被理解,希望在未来,将有更多关于使GDS特别在嵌入式模式下工作的文档。

相关问题