Nebula Graph介紹和SpringBoot環境連接和查詢

Nebula Graph介紹和SpringBoot環境連接和查詢
轉載請注明來源 https://www.cnblogs.com/milton/p/16784098.html
說明當前Nebula Graph的最新版本是3.2.1, 根據官方的文檔進行配置https://docs.nebula-graph.io/3.2.1/14.client/4.nebula-java-client/
Nebula Graph 的一些特點

  1. 支持分布式. 相對于Neo4j, TigerGraph這些圖數據庫, Nebula 是面向分布式設計的, 因此對集群的支持比較完備, 在規模上上限要高很多. 在實際項目中存儲了180億的點邊, 這個數量對于Neo4j和TigerGraph是比較困難的.
  2. 支持圖空間. 各個圖空間的ID是互不干擾的, 但是在同一個圖空間里ID的類型和長度必須一致. 注意這個一致約束的是所有的點和邊. Nebula 可以使用int64作為ID, 也可以用字符串, 但是字符串需要指定一個長度, 例如64個字節. 相對于只能用長整數的Neo4j, ID設計上更自由靈活.
  3. 點對應的類型叫TAG, 邊對應的類型叫EDGE
    1. TAG和EDGE都會對應一組的屬性(map, 或者說dict)
    2. 一個點可以對多個TAG, 每個TAG一組屬性, 多組屬性. 項目中建議一開始不要用多TAG, 在整個圖結構穩定后, 再做合并
    3. 一個邊只對應一個EDGE, 一組屬性
  4. Nebula 用的是自定義的查詢語法 GQL, 和 cypher 語法基本一樣
  5. 除了點邊的ID和關聯關系外, 只有帶索引的屬性可以查詢. 這點和其它圖數據庫不一樣, 其它數據庫即使沒有索引, 慢是慢點但是不報錯, Nebula直接給你返回錯誤.
  6. 對于返回數量較大的查詢, Nebula會強制查詢必須帶limit
  7. Nebula 單節點穩定性是有問題的, 在3.2.1版本中觀察到偶爾會出現服務自行退出, 如果在生產環境使用, 需要有后臺監控進行心跳檢測和自動啟動
GQL 常用查詢下面列出一些常用的查詢
-- 列出圖空間SHOW SPACES;-- 列出tag(點類型)和edge(邊類型), 需要先 USE 一個圖空間SHOW TAGS;SHOW EDGES;列出某一類型的點和邊
MATCH ()-[e:follow]-() RETURN eMATCH (v:player) RETURN v帶條件的查詢, 在結果數量較多時必須帶limit, 否則Nebula會報錯
match (v:ADDRESS)-[e]-() where id(v)==\"ADD:82388116\" return v,e limit 100基礎配置和使用在上面的鏈接中, 提供了最小的配置和測試代碼
pom.xml 增加包依賴對于Nebula Graph 3.2.1, 需要使用3.0.0的版本. client的每個版本只能對應特定的一兩個服務端版本
<dependency> <groupId>com.vesoft</groupId> <artifactId>client</artifactId> <version>3.0.0</version></dependency>Java調用Java調用主要是三部分, 創建連接池, 創建會話, 執行查詢
創建 NebulaPool 連接池連接到地址127.0.0.1, 端口9669, 連接池大小100. 注意地址和端口是一個列表, Nebula是支持集群的. 連接時不需要用戶和密碼
NebulaPool pool = new NebulaPool();try { NebulaPoolConfig nebulaPoolConfig = new NebulaPoolConfig(); nebulaPoolConfig.setMaxConnSize(100); List<HostAddress> addresses = Arrays.asList(new HostAddress("127.0.0.1", 9669)); Boolean initResult = pool.init(addresses, nebulaPoolConfig); if (!initResult) {log.error("pool init failed.");return; }} catch ()//...創建 Session 會話創建會話時需要用戶名和密碼
Session session = pool.getSession("root", "nebula", false);執行查詢創建一個SPACE, 然后使用這個SPACE, 創建一個TAG person, 創建一個EDGE like
String createSchema = "CREATE SPACE IF NOT EXISTS test(vid_type=fixed_string(20)); "+ "USE test;"+ "CREATE TAG IF NOT EXISTS person(name string, age int);"+ "CREATE EDGE IF NOT EXISTS like(likeness double)";ResultSet resp = session.execute(createSchema);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",createSchema, resp.getErrorMessage())); System.exit(1);}添加一個點記錄
String insertVertexes = "INSERT VERTEX person(name, age) VALUES "+ "'Bob':('Bob', 10), "+ "'Lily':('Lily', 9), "+ "'Tom':('Tom', 10), "+ "'Jerry':('Jerry', 13), "+ "'John':('John', 11);";ResultSet resp = session.execute(insertVertexes);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",insertVertexes, resp.getErrorMessage())); System.exit(1);}查詢
String query = "GO FROM \"Bob\" OVER like "+ "YIELD $^.person.name, $^.person.age, like.likeness";ResultSet resp = session.execute(query);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",query, resp.getErrorMessage())); System.exit(1);}printResult(resp);在 SpringBoot 項目中使用 Nebula Graphpom.xml 增加包依賴<dependency> <groupId>com.vesoft</groupId> <artifactId>client</artifactId> <version>3.0.0</version></dependency>Session工廠: NebulaSessionFactory.java配合

推薦閱讀