1. 程式人生 > >[bigdata-082] 圖資料庫neo4j安裝執行介面文件python3開發示例

[bigdata-082] 圖資料庫neo4j安裝執行介面文件python3開發示例

1. 官網
https://neo4j.com/
原始碼地址 https://github.com/neo4j


2. 下載
wget https://neo4j.com/artifact.php?name=neo4j-community-3.2.0-unix.tar.gz


3. 安裝
tar xvf neo4j-community-3.2.0-unix.tar.gz


4. 以console方式執行
./bin/neo4j console


5.或者 以服務方式執行
./bin/neo4j server
注意:4和5任選一個。


6. 在瀏覽器登入http://localhost:7474
需要輸入使用者名稱和密碼,預設值都是neo4j
更改新密碼為123456


7. 關於服務
You are connected as user neo4j
to the server bolt://localhost:7687
Connection credentials are stored in your web browser.




8. neo4j核心
8.1 定義
nodes: 圖資料記錄
relationships: 連線nodes的邊,也叫關係
properties: 屬性值


8.2 圖資料庫
8.2.1 一個節點,就是一個最小的圖資料庫
8.2.2 對節點加個標籤label,比如"persion"標籤。標籤也可以有屬性值。一個節點可以有0各或者多個標籤。
8.2.3 連線資料--給兩個節點加上一個標籤表示連線關係。關係是有向的,關係是有型別的。




9 開發手冊
https://neo4j.com/docs/developer-manual/3.2/
這個手冊有些連線打不開,奇怪。




10. neo4j的python3開發
10.1 驅動地址
https://neo4j.com/docs/developer-manual/current/drivers/get-started/
10.2 安裝python3驅動
pip3 install neo4j-driver


10.3 啟動服務
./bin/neo4j start
Active database: graph.db
Directories in use:
  home:         /home/brian/usr/neo4j/neo4j-community-3.2.0
  config:       /home/brian/usr/neo4j/neo4j-community-3.2.0/conf
  logs:         /home/brian/usr/neo4j/neo4j-community-3.2.0/logs
  plugins:      /home/brian/usr/neo4j/neo4j-community-3.2.0/plugins
  import:       /home/brian/usr/neo4j/neo4j-community-3.2.0/import
  data:         /home/brian/usr/neo4j/neo4j-community-3.2.0/data
  certificates: /home/brian/usr/neo4j/neo4j-community-3.2.0/certificates
  run:          /home/brian/usr/neo4j/neo4j-community-3.2.0/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
Started neo4j (pid 8325). It is available at http://localhost:7474/
There may be a short delay until the server is ready.
See /home/brian/usr/neo4j/neo4j-community-3.2.0/logs/neo4j.log for current status.


注意啟動資訊:
啟動後,活動的neo4j的庫是graph.db,它的資料儲存在neo4j的目錄下的data/databases/graph.db這個目錄。


在瀏覽器輸入http://localhost:7474/,可以看到圖形介面。
You are connected as user neo4j
to the server bolt://localhost:7687
Connection credentials are stored in your web browser.


10.4 用python3實現第一個例子
----------------------------
#!/usr/bin/env python3
#!-*- coding:utf-8 -*-


from neo4j.v1 import GraphDatabase


uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "123456"))


def print_friends_of(name):
    with driver.session() as session:
        with session.begin_transaction() as tx:
            for record in tx.run("MATCH (a:Person)-[:KNOWS]->(f) "
                                 "WHERE a.name = {name} "
                                 "RETURN f.name", name=name):
                print(record["f.name"])


print_friends_of("Alice")
----------------------------




10.5 driver object
一個driver object管理一個neo4j的一個例項,包括這個例項下的所有資料庫,包括url,帳號密碼,配置。它管理一個連線池,由管理Session例項。
---------------------------
from neo4j.v1 import GraphDatabase
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "123456"))
---------------------------


10.6 cypher sessions
一個session是一個邏輯上下文,它是neo4j的事務單元的執行環境。


10.7 type system型別系統
這裡包括Node, Relationship, Path。




11. Cypher語法
11.1 建立一個只有一節點的圖,其實也就是資料
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
建立這個節點後,資料就寫入到檔案持久化儲存了,neo4j關閉重啟節點都會在。
11.2 從圖裡查詢一個節點
MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
MATCH (ee {name: "Emil"}) RETURN tom
11.3 建立更多的節點
MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
注意,節點可以被重複加入,所有屬性相同的節點可以存在。


11.4 尋找一個演員演出過的所有電影
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies




11.5 刪除全部節點和關係
MATCH (n) DETACH DELETE n




12. 進一步細節
兩個節點的關係,也叫做pattern。比如說,一個人住在一個城市  a persion LIVES_IN a city。一個城市是一個國家的一部分 a city is PART_OF a country.




簡單的pattern可以再次組裝成複雜模式,比如 (:person) -[:LIVES_IN]-> (:city) -[:PART_OF]-> (:Country)




12.1 node的例子
()
(matrix)
(:Movie)
(matrix:Movie)
(matrix:Movie {title: "The Matrix"})
(matrix:Movie {title: "The Matrix", released: 1997})


12.2 relationship的例子
-->
-[role]->
-[:ACTED_IN]->
-[role:ACTED_IN]->
-[role:ACTED_IN {roles: ["Neo"]}]->


"--"無向關係
"-->"和"<--"表示有向關係
[..]用於增加細節,包括變數名,屬性,and/or資訊。




12.3 一個複雜的組合pattern
(keanu:Person:Actor {name:  "Keanu Reeves"} )
-[role:ACTED_IN     {roles: ["Neo"] } ]->
(matrix:Movie       {title: "The Matrix"} )


變數keanu表示一個person也就是一個actor,它的屬性name是"Keanu Reeves"。
變數matrix表示一個move,它的屬性title是"The Matrix"
變數keanu和matrix之間有一個有向的label,keanu對matrix有ACTED_IN關係,這個relationship的變數名是role,這個relationship的屬性是reoles是"neo"。




12.4 pattern可以表示為變數,比如
acted_in = (:Person)-[:ACTED_IN]->(:Movie)




13. cypher
13.1 查詢一個人的朋友的朋友關係
MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof)
RETURN john.name, fof.name
13.2 這又是一個複雜查詢關係
MATCH (user)-[:friend]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user.name, follower.name