neo4j自定義函數和存儲過程

 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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章