【问题标题】:Neo4j 3.0.3 Stored procedures in ScalaNeo4j 3.0.3 Scala 中的存储过程
【发布时间】:2016-07-11 17:41:17
【问题描述】:

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

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

================== 原因:org.neo4j.kernel.lifecycle.LifecycleException:组件'org.neo4j.kernel.impl.proc.Procedures@1ac0223'已成功初始化,但无法启动。请参阅附件原因异常。 在 org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:444) 在 org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:107) 在 org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:140) ... 10 更多 原因:org.neo4j.kernel.api.exceptions.ProcedureException:无法在“neoscala”类中找到可用的公共无参数构造函数。请添加一个有效的公共构造函数,重新编译该类并重试。 ==================

我使用的 scala 类是:

包neoproc 导入 org.neo4j.graphdb.GraphDatabaseService 导入 org.neo4j.procedure.Procedure; 导入 javax.ws.rs.core.{上下文,响应} 类 Neoscala(@Context db: GraphDatabaseService) { @程序 默认爱丽丝():字符串= { String.valueOf(db.execute("MATCH (n:User) return n")); } }

【问题讨论】:

    标签: scala neo4j


    【解决方案1】:

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

    两者都有记录

    • user documentation:

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

    • Javadoc:

      过程方法本身可以包含任意 Java 代码 - 但为了使用底层图形,它必须能够访问图形 API。这是通过在过程类中声明字段并使用 Context 注释对它们进行注释来完成的。以这种方式声明的字段会自动注入请求的资源。这就是过程获取 API 访问权限的方式。

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

    显然create a class with a public field in Scala 是不可能的,因此您必须使用公共字段创建一个父 Java 类,并使用您的 Scala 类对其进行扩展:

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

    【讨论】:

      【解决方案2】:

      解决方法如下:

      我们将在 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 中的过程总是在 Stream 中返回结果,它是 Java8 中的最新功能,因此我们还将使用 Java 类来返回最终结果并用于定义公共变量。

      我们将为结果创建 Java 类:

      public class JavaHelper {
      
      @Context
      public GraphDatabaseService db;
      
      @Context
      public Log log;
      
       public static class SearchHit {
          //your result code here
      }
      

      您可以参考knoldus blog for Neo4j User Defined Procedure 使用 Scala 创建和存储 Neo4j 过程。在这里您还可以找到带有 git hub 存储库的示例代码。

      【讨论】:

        猜你喜欢
        • 2014-03-13
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        相关资源
        最近更新 更多