当前位置: 首页 > 知识库问答 >
问题:

Scala中的Neo4j 3.0.3存储过程

艾鹭洋
2023-03-14

在Neo4j-3.0.3中,是否有用于创建存储过程的Scala代码示例?

我一直在尝试创建一个简单的基于Scala的存储过程。下面是当我将scala-jar文件复制到neo4j-plugins目录并启动neo4j服务器时收到的错误消息:

=================
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.impl.proc.Procedures@1ac0223' was successfully initialized, but failed to start. Please see attached cause exception.
        at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:444)
        at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:107)
        at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:140)
        ... 10 more
Caused by: org.neo4j.kernel.api.exceptions.ProcedureException: Unable to find a usable public no-argument constructor in the class `neoscala`. Please add a valid, public constructor, recompile the class and try again.
=================

    package neoproc

    import org.neo4j.graphdb.GraphDatabaseService
    import org.neo4j.procedure.Procedure;
    import javax.ws.rs.core.{Context, Response}

    class neoscala(@Context db: GraphDatabaseService) {

     @Procedure
    def alice():String = {
        String.valueOf(db.execute( "MATCH (n:User) return n" ));
     }
    }

共有2个答案

郤坚诚
2023-03-14

以下是解决方案:

我们将在scala中创建类:

  class FullTextIndex extends JavaHelper {
     @Procedure("example.search")
     @PerformsWrites
         def search(@Name("label") label: String,
                    @Name("query") query:  String): Stream[SearchHit] = {
           //declare your method 
           }

        val nodes: Stream[Node] = db.index.forNodes(index).query(query).stream

       val newFunction: java.util.function.Function[Node, SearchHit] = (node: Node) => new SearchHit(node)
           nodes.map {
                 newFunction
           }
      }

       private def indexName(label: String): String = {
           "label-" + label
   }
 }

Neo4j中的过程总是在流中返回结果,这是Java8中的最新特性,因此我们还将使用Java类来返回最终结果和定义公共变量。

我们将为结果创建Java类:

public class JavaHelper {

@Context
public GraphDatabaseService db;

@Context
public Log log;

 public static class SearchHit {
    //your result code here
}

您可以参考knoldus博客了解Neo4j用户定义的过程,该过程用于使用Scala创建和存储Neo4j过程。在这里,您还可以找到git hub repository的示例代码。

饶骁
2023-03-14

Scala类用GraphDatabaseService参数声明了一个构造函数,异常告诉您它只需要一个无参数构造函数。

两者都有记录

>

过程类中只允许使用静态字段和@Context注释字段。

该Javadoc:

过程方法本身可以包含任意Java代码——但是为了使用基础图,它必须能够访问图应用编程接口。这是通过在过程类中声明字段并使用上下文注释对其进行注释来实现的。以这种方式声明的字段会自动注入请求的资源。这就是过程获得API访问权限的方式。

类中包含过程声明的所有字段必须是静态的;或者它必须是公开的、非最终的,并带有上下文注释。

显然,在Scala中不可能创建一个带有公共字段的类,因此您必须创建一个带有公共字段的父Java类,并使用Scala类对其进行扩展:

// ProcedureAdapter.java
public abstract class ScalaProcedureAdapter {
    @Context
    public GraphDatabaseService db;
}

// neoscala.scala
class neoscala extends ScalaProcedureAdapter {
    // ...
}
 类似资料:
  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 你好,我有一个简单的过程,编译好,但在我初始化变量后,错误是这样的。 该表是这样创建的 该过程如下所示: ORA-06502:PL/SQL:数值或值错误 ORA-06512:at“doma.quera_pomocky”,第9行 ORA-06512:at第1行 06502。00000-“PL/SQL:数值或值错误%s” *原因:出现算术、数值、字符串、转换或约束错误。例如,如果尝试将值NULL赋给声

  • 我如何在服务器的另一个存储过程中执行SQL存储过程?我将如何传递第二个过程的参数。?

  • 我有一个存储过程叫做 我试图将它们的结果存储在数据表中。 它会导致以下错误: 系统。数据。Odbc。ORA-00900:无效的SQL语句 在ConexionBD.ConnectAndQuery(stringlayername、decimalidelemento、stringidelementostring、stringconexion)。 我的代码:

  • 数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法: $resultSet = Db::query('call procedure_name'); foreach ($resultSet as $result) { } 存储过程返回的是一个数据集,如果你的存储过程不需要返回任何的数据,那么也可以使用execute方法: Db::execute('call procedure_name'