2016-07-11 9 views
0

Neo4j-3.0.3でストアドプロシージャを作成するためのサンプルScalaコードはありますか?Neo4j 3.0.3 Scalaのストアドプロシージャ

私は1つの簡単なScalaベースのストアドプロシージャを作成しようとしています。以下は私がのNeo4j-pluginsディレクトリに自分のscala-jarファイルをコピーしてのNeo4jサーバを起動したときに私が取得エラーメッセージです:

 
================= 
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component '[email protected]' 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. 
================= 

私が使用しているScalaのクラスがされています。

 

    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")); 
    } 
    } 

答えて

1

あなたのScalaクラスはGraphDatabaseService引数を持つコンストラクタを宣言しています。例外は引数なしのコンストラクタしか必要ないことを伝えます。

これは、両方の

  • user documentationを文書化しています:

    のみ静的フィールドと@コンテキスト-注釈付きのフィールドは手順クラスで許可されています。

  • Javadoc

    手続き方法自体は、任意のJavaコードを含めることができます - しかし、根本的なグラフで動作するためには、グラフAPIへのアクセス権を持っている必要があります。これは、プロシージャー・クラスのフィールドを宣言し、コンテキスト・アノテーションで注釈を付けることによって行われます。この方法で宣言されたフィールドには、要求されたリソースが自動的に注入されます。これは、プロシージャがどのようにAPIにアクセスして作業を行うかを示します。

    プロシージャ宣言を含むクラスのすべてのフィールドは、静的である必要があります。公開されていなくてはならず、Contextで注釈が付けられていなければなりません。

あなたが公共の場で親Javaクラスを作成する必要があり、あなたのScalaのクラスでそれを拡張しますので、どうやらそれは、create a class with a public field in Scalaすることはできません。ここで

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

// neoscala.scala 
class neoscala extends ScalaProcedureAdapter { 
    // ... 
} 
-1

ですこのためのソリューション:

我々は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クラスと、public変数を定義するためにJavaクラスを使用します。

我々は結果のためのJavaクラスを作成します。

public class JavaHelper { 

@Context 
public GraphDatabaseService db; 

@Context 
public Log log; 

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

あなたはスカラ座でのNeo4j手順を作成し、保存するためのknoldus blog for Neo4j User Defined Procedureを参照することができます。ここではgit hubリポジトリでサンプルコードを見ていきます。

関連する問題