neo4j圖形資料庫第三彈——整合springboot(支援查詢多節點)
阿新 • • 發佈:2018-12-01
正經學徒,佛系記錄,不搞事情
官網結合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