2016-07-11 31 views
0

有沒有可用於在Neo4j-3.0.3中創建存儲過程的示例Scala代碼?Neo4j 3.0.3 Scala中的存儲過程

我一直在試圖創建一個簡單的基於Scala的存儲過程。下面是錯誤消息我收到的時候我在我的斯卡拉-jar文件複製到的Neo4j-plugins目錄並啓動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。這是通過在過程類中聲明字段並使用Context註釋對它們進行註釋來完成的。以這種方式聲明的字段會自動注入請求的資源。這就是程序如何訪問API來使用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 { 
    // ... 
} 
-1

這裏是該解決方案:

我們將在斯卡拉創建類:

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 Class來返回最終結果並定義公共變量。

我們將創建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用於創建和存儲Neo4j的程序使用Scala。在這裏您還可以找到帶有git集線庫的示例代碼。