1. 程式人生 > >neo4j圖形資料庫第三彈——整合springboot(支援查詢多節點)

neo4j圖形資料庫第三彈——整合springboot(支援查詢多節點)

正經學徒,佛系記錄,不搞事情

官網結合java的使用方式:https://neo4j.com/developer/java/

這裡使用springboot

第一步:引入pom

<dependency>
    <groupId>org.neo4j.driver</groupId>
	<artifactId>neo4j-java-driver</artifactId>
	<version>1.4.4</version>
</dependency>

第二步:配置yml

neo4j:
  url: bolt://127.0.0.1:7687
  username: neo4j
  password: 123456

第三步:獲取neo4j驅動

更多詳細的初始化配置參考api:https://neo4j.com/docs/api/java-driver/current/org/neo4j/driver/v1/GraphDatabase.html

@Configuration
public class Neo4jConf {
    //從yml檔案獲取配置資訊
    @Value("${neo4j.url}")
    private String url;
    @Value("${neo4j.username}")
    private String username;
    @Value("${neo4j.password}")
    private String password;

    @Bean(name = "driver")
    public Driver initDriver() {
        Driver driver;
        try {
            //neo4j地址 賬號 密碼
            driver = GraphDatabase.driver(url, AuthTokens.basic(username, password));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return driver;
    }
}

第四步:建立工具類

@Component
public class Neo4jUtil {
    private static Driver driver;

    @Autowired
    public Neo4jUtil(Driver driver) {
        Neo4jUtil.driver = driver;
    }

    /**
     * cql的return返回多種節點match (n)-[edge]-(n) return n,m,edge:限定返回關係時,關係的別名必須“包含”edge
     * @param cql 查詢語句
     * @param lists 和cql的return返回節點順序對應
     * @return List<Map<String,Object>>
     */
    public static <T> void getList(String cql, Set<T>... lists) {
        //用於給每個Set list賦值
        int listIndex = 0;
        try {
            Session session = driver.session();
            StatementResult result = session.run(cql);
            List<Record> list = result.list();
            for (Record r : list) {
                if (r.size() != lists.length) {
                    System.out.println("節點數和lists數不匹配");
                    return;
                }
            }
            for (Record r : list) {
                for (String index : r.keys()) {
                    //對於關係的封裝
                    if (index.indexOf("edge") != -1) {
                        Map<String, Object> map = new HashMap<>();
                        //關係上設定的屬性
                        map.putAll(r.get(index).asMap());
                        //外加三個固定屬性
                        map.put("edgeId", r.get(index).asRelationship().id());
                        map.put("edgeFrom", r.get(index).asRelationship().startNodeId());
                        map.put("edgeTo", r.get(index).asRelationship().endNodeId());
                        lists[listIndex++].add((T) map);
                    }
                    //對於節點的封裝
                    else {
                        Map<String, Object> map = new HashMap<>();
                        //節點上設定的屬性
                        map.putAll(r.get(index).asMap());
                        //外加一個固定屬性
                        map.put("nodeId", r.get(index).asNode().id());
                        lists[listIndex++].add((T) map);
                    }
                }
                listIndex = 0;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第五步:呼叫

@RestController
public class TestController {
    @Autowired
    private Neo4jUtil neo4jUtil;

    @GetMapping("get")
    public Map<String, Object> get2(){
        Map<String, Object> retMap = new HashMap<>();
        //cql語句
        String cql = "match (m)-[edge1]-(n) return m,edge1,n";
        //待返回的值,與cql return後的值順序對應
        Set<Map<String ,Object>> m = new HashSet<>();
        Set<Map<String ,Object>> edge = new HashSet<>();
        Set<Map<String ,Object>> n = new HashSet<>();
        neo4jUtil.getList(cql,m,edge,n);
        retMap.put("m",m);
        retMap.put("edge",edge);
        retMap.put("n",n);
        return retMap;
    }
}

該方法支援cql語句後返回多個節點,注:如果需要返回的是關係,必須使用帶有edge的別名,可以是edge1、edgePerson......

第六步:結果

粗製濫造,不放git

專案地址:

https://pan.baidu.com/s/1KC8VAQJhPjD_8dzz9-zTHg 提取碼: hrb3