1.依賴如下
<properties>
<neo4j.version>3.4.9</neo4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>${neo4j.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.neo4j.test</groupId>
<artifactId>neo4j-harness</artifactId>
<version>${neo4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.4.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.ecf</groupId>
<artifactId>org.apache.log4j</artifactId>
<version>1.2.15.v201012070815</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- Neo4j Procedures require Java 8 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
</plugin>
</plugins>
</build>
2.自定義函數
package com.yuanyk.plugin;
import org.neo4j.procedure.Description;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.UserFunction;
public class UserFunctions {
@UserFunction("my.greet")
@Description("問候")
public String greet(@Name("name") String name) {
return "Hello "+name;
}
}
測試
package com.yuanyk.plugin;
import org.junit.Rule;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.harness.junit.Neo4jRule;
public class UserFunctionTest {
@Rule
public Neo4jRule neo4j = new Neo4jRule().withFunction(UserFunctions.class);
@Test
public void testGreeting() {
GraphDatabaseService db = neo4j.getGraphDatabaseService();
Result result = db.execute("return my.greet('yyk') as res");
System.out.println(result.next().get("res").toString());
}
}
3.自定義存儲過程
package com.yuanyk.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Transaction;
import org.neo4j.logging.Log;
import org.neo4j.procedure.Context;
import org.neo4j.procedure.Description;
import org.neo4j.procedure.Mode;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.Procedure;
public class UserProducer {
/**
* 運行環境/上下文
*/
@Context
public GraphDatabaseService db;
@Context
public Log log;
public static Label Customer = Label.label("Customer");
/**
* mode - 執行模式:
* • Mode.READ – 對圖執行只讀操作
* • Mode.WRITE - 對圖執行讀寫操作
* • Mode.SCHEMA – 操作數據庫模式,例如創建索引、限制等
* • Mode.DBMS – 系統操作,但是不包括圖操作
* • Mode.DEFAULT – 缺省是 Mode.READ
*
* @param
* @return
* @Description的內容會在Neo4j瀏覽器中調用dbms.procedures() 時顯示)
*/
@Procedure(name = "my.createCustomerNode", mode = Mode.WRITE)
@Description("Create a new Customer node")
public Stream<NodeResult> createCustomerNode(@Name("name") String name) {
List<NodeResult> output = new ArrayList<>();
try (Transaction tx = db.beginTx()) {
Node node = db.createNode(Customer);
node.setProperty("name", name);
output.add(new NodeResult(node));
log.debug("Creating Customer with Node ID " + node.getId());
tx.success();
}
return output.stream();
}
/**
* @param
* @Description: TODO(結果對象)
* @return
*/
public static class NodeResult {
public Node node;
public NodeResult(Node node) {
this.node = node;
}
}
}
測試
package com.yuanyk.plugin;
import org.junit.Rule;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.harness.junit.Neo4jRule;
public class UserProducerTest {
@Rule
public Neo4jRule neo4j = new Neo4jRule().withProcedure(UserProducer.class);
@Test
public void testCreateCustomerNode() {
GraphDatabaseService db = neo4j.getGraphDatabaseService();
try(Transaction ts = db.beginTx()){
Result result = db.execute("call my.createCustomerNode('test') yield node return node");
Node node = (Node)result.next().get("node");
System.out.println(node.getProperty("name"));
System.out.println(node);
}
}
}
4.打包
maven insatll後會在target目錄下生成jar包,將jar包放到neo4j項目的plugin目錄下,重啓neo4j即可
5.驗證
在瀏覽器命令行中輸入 call dbms.functions() 可以找到自定義的函數
輸入 call dbms.procedures()可以找到自定義的存儲過程
應用:
call my.createCustomerNode('yyk') yield node return my.greet(node.name)
代碼地址:https://github.com/yykunn/my-neo4j-plugin
參考:https://blog.csdn.net/superman_xxx/article/details/81514691