點(diǎn)開圖片跳到網(wǎng)站怎么做網(wǎng)絡(luò)營銷最火的案例
探索數(shù)據(jù)之間的奧秘:Neo4j圖數(shù)據(jù)庫引領(lǐng)新紀(jì)元
在數(shù)字化浪潮洶涌的今天,數(shù)據(jù)已成為企業(yè)最寶貴的資產(chǎn)之一。然而,隨著數(shù)據(jù)量的爆炸性增長和數(shù)據(jù)關(guān)系的日益復(fù)雜,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在處理諸如社交網(wǎng)絡(luò)、推薦系統(tǒng)、生物信息學(xué)等高度互聯(lián)的數(shù)據(jù)時顯得力不從心。Neo4j,作為圖數(shù)據(jù)庫領(lǐng)域的佼佼者,遙遙領(lǐng)先!
neo4j簡介
- neo4j是由Java實(shí)現(xiàn)的開源NoSQL圖數(shù)據(jù)庫。自從2003年開始研發(fā),到2007年發(fā)布第一版。neo4j現(xiàn)如今已經(jīng)被各行各業(yè)的數(shù)十萬家公司和組織采用。
-
neo4j實(shí)現(xiàn)了專業(yè)數(shù)據(jù)庫級別的圖數(shù)據(jù)模型的存儲。與普通的圖處理或內(nèi)存級數(shù)據(jù)庫不同,neo4j提供了完整的數(shù)據(jù)庫特性,包括ACID事物的支持,集群支持,備份與故障轉(zhuǎn)移等。這使其適合于企業(yè)級生產(chǎn)環(huán)境下的各種應(yīng)用。
- neo4j的版本說明:
- 企業(yè)版:需要高額的付費(fèi)獲得授權(quán),提供高可用,熱備份等性能。
- 社區(qū)開源版:免費(fèi)使用,但只能單點(diǎn)運(yùn)行。
neo4j圖數(shù)據(jù)庫概念?
??節(jié)點(diǎn):節(jié)點(diǎn)是Neo4j圖數(shù)據(jù)庫中的基本元素,用于表示實(shí)體或?qū)ο蟆C總€節(jié)點(diǎn)都可以看作是一個獨(dú)立的實(shí)體,如一個人、一部電影或一個城市。
- 可以將節(jié)點(diǎn)類比為關(guān)系型數(shù)據(jù)庫中的表,對應(yīng)的標(biāo)簽可以類比為不同的表名,屬性就是表中的列。
??屬性:屬性是附加在節(jié)點(diǎn)或關(guān)系上的鍵值對,用于描述節(jié)點(diǎn)或關(guān)系的詳細(xì)特征。
??關(guān)系:關(guān)系連接兩個節(jié)點(diǎn),關(guān)系是方向性的,關(guān)系可以有一個或多個屬性
??標(biāo)簽:標(biāo)簽是Neo4j中對節(jié)點(diǎn)進(jìn)行分類和組織的一種方式,類似于關(guān)系型數(shù)據(jù)庫中的表名。
neo4j圖數(shù)據(jù)庫的安裝?
neo4j圖數(shù)據(jù)庫的安裝流程:
第一步:將neo4j安裝信息載入到y(tǒng)um檢索列表。
第二步:使用yum install命令安裝。
第三步:修改配置文件內(nèi)容 /etc/neo4j/neo4j.conf.
第四步:啟動neo4j數(shù)據(jù)庫。
💦第一步:將neo4j安裝信息載入到y(tǒng)um檢索列表
sudo rpm --import https://debian.neo4j.com/neotechnology.gpg.key
sudo yum-config-manager --add-repo https://yum.neo4j.com/stable
💦第二步:使用yum install命令安裝
yum install neo4j
💦第三步:修改配置文件默認(rèn)在/etc/neo4j/neo4j.conf
dbms.directories.data=/var/lib/neo4j/data
dbms.directories.plugins=/var/lib/neo4j/plugins
dbms.directories.certificates=/var/lib/neo4j/certificates
dbms.directories.logs=/var/log/neo4j
dbms.directories.lib=/usr/share/neo4j/lib
dbms.directories.run=/var/run/neo4j# 導(dǎo)入的位置
dbms.directories.import=/var/lib/neo4j/import# 初始化內(nèi)存大小
dbms.memory.heap.initial_size=512m # web頁面地址
dbms.connectors.default_listen_address=0.0.0.0# HTTP Connector. There can be zero or one HTTP connectors.
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:7474 # HTTPS Connector. There can be zero or one HTTPS connectors.
dbms.connector.https.enabled=true
dbms.connector.https.listen_address=:7473 dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=:7687
💦第四步:啟動neo4j數(shù)據(jù)庫
# 啟動命令
neo4j start
- 注意:如果使用的是云服務(wù)器,那么上述用到了7473端口、7687端口、就需要單獨(dú)去開端口。
neo4j的可視化管理后臺登陸?
(云服務(wù)器公網(wǎng)IP):7474? ? --> 進(jìn)入瀏覽器界面
🧨Cypher介紹與使用
Cypher是一種描述性的圖形查詢語言,相當(dāng)于MySQL中的SQL語句。
create命令
💯創(chuàng)建圖數(shù)據(jù)中的節(jié)點(diǎn)
# 創(chuàng)建命令格式:
# create是關(guān)鍵字,創(chuàng)建節(jié)點(diǎn)名稱node_name, 節(jié)點(diǎn)標(biāo)簽Node_Label, 放在小括號里面()
# 后面把所有屬于節(jié)點(diǎn)標(biāo)簽的屬性放在大括號'{}'里面,依次寫出屬性名稱:屬性值,不同屬性用逗號','分隔
# 例如下面命令創(chuàng)建一個節(jié)點(diǎn)e, 節(jié)點(diǎn)標(biāo)簽是Employee, 擁有id, name, salary, deptnp四個屬性:
CREATE (e:Employee{id:222, name:'Bob', salary:6000, deptnp:12})
match命令
💯匹配(查詢)已有數(shù)據(jù)
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptnoMATCH (n) return n # 查詢所有結(jié)點(diǎn)
merge命令
💯若節(jié)點(diǎn)存在,則等效與match命令; 節(jié)點(diǎn)不存在,則等效于create命令。
MERGE (e:Employee {id:146, name:'Lucer', salary:3500, deptno:16})
成功創(chuàng)建!
-
然后再次用merge查詢,發(fā)現(xiàn)數(shù)據(jù)庫中的數(shù)據(jù)并沒有增加,因?yàn)橐呀?jīng)存在相同的數(shù)據(jù)了,merge匹配成功。
?
使用create創(chuàng)建關(guān)系
💯必須創(chuàng)建有方向性的關(guān)系,否則報(bào)錯。
# 創(chuàng)建一個節(jié)點(diǎn)p1到p2的有方向關(guān)系,這個關(guān)系r的標(biāo)簽為Buy, 代表p1購買了p2, 方向?yàn)閜1指向p2
CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)
創(chuàng)建完成關(guān)系后,再次查看全部:
使用merge創(chuàng)建關(guān)系
💯可以創(chuàng)建有/無方向性的關(guān)系。
# 創(chuàng)建一個節(jié)點(diǎn)p1到p2的無方向關(guān)系,這個關(guān)系r的標(biāo)簽為miss, 代表p1-miss-p2, 方向?yàn)橄嗷サ?MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)
where命令
💯類似于SQL中的添加查詢條件。
# 查詢節(jié)點(diǎn)Employee中,id值等于123的那個節(jié)點(diǎn)
MATCH (e:Employee) WHERE e.id=123 RETURN e
delete命令
💯刪除節(jié)點(diǎn)/關(guān)系及其關(guān)聯(lián)的屬性。
# 注意:刪除節(jié)點(diǎn)的同時,也要刪除關(guān)聯(lián)的關(guān)系邊
MATCH (p1:Profile1)-[r]-(p2:Profile2) DELETE p1, r, p2
sort命令
Cypher命令中的排序使用的是order by
# 匹配查詢標(biāo)簽Employee, 將所有匹配結(jié)果按照id值升序排列后返回結(jié)果
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id# 如果要按照降序排序,只需要將ORDER BY e.salary改寫為ORDER BY e.salary DESC
MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.salary DESC
字符串函數(shù):
- toUpper()函數(shù)
- toLower()函數(shù)
- substring()函數(shù)
- replace()函數(shù)
toUpper()函數(shù)
將一個輸入字符串轉(zhuǎn)換為大寫字母。
- 演示:
MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno
?
💩toLower()函數(shù)?:將一個輸入字符串轉(zhuǎn)換為小寫字母。
💩substring()函數(shù):返回一個子字符串。
💩replace()函數(shù) :替換掉子字符串。
聚合函數(shù)
- count()函數(shù)
- max()函數(shù)
- min()函數(shù)
- sum()函數(shù)
- avg()函數(shù)
count()函數(shù) :返回由match命令匹配成功的條數(shù)。
MATCH (e:Employee) RETURN count( * )
max()函數(shù) :返回由match命令匹配成功的記錄中的最大值。
# 返回匹配標(biāo)簽Employee成功的記錄中,最高的工資數(shù)字
MATCH (e:Employee) RETURN max(e.salary)
?其余的就不過多贅述,相信大家也明白了~
索引index?
- Neo4j支持在節(jié)點(diǎn)或關(guān)系屬性上的索引,以提高查詢的性能。
- 可以為具有相同標(biāo)簽名稱的所有節(jié)點(diǎn)的屬性創(chuàng)建索引。
創(chuàng)建索引:使用create index on來創(chuàng)建索引。
# 創(chuàng)建節(jié)點(diǎn)Employee上面屬性id的索引
CREATE INDEX ON:Employee(id)
?
在Python中使用neo4j?
-
neo4j-driver是一個python中的package, 作為python中neo4j的驅(qū)動,幫助我們在python程序中更好的使用圖數(shù)據(jù)庫。
pip install neo4j-driver
from neo4j import GraphDatabase uri = "bolt://localhost:7687" # Neo4j 數(shù)據(jù)庫的 Bolt URI
user = "neo4j" # 用戶名
password = "你的密碼" # 密碼 driver = GraphDatabase.driver(uri, auth=(user, password))def create_person(tx, name): """在 Neo4j 數(shù)據(jù)庫中創(chuàng)建一個 Person 節(jié)點(diǎn)""" tx.run("CREATE (a:Person {name: $name})", name=name) with driver.session() as session: session.write_transaction(create_person, "Alice") session.write_transaction(create_person, "Bob")def get_person(tx, name): """查詢并返回指定名稱的 Person 節(jié)點(diǎn)""" result = tx.run("MATCH (a:Person {name: $name}) RETURN a.name AS name", name=name) return [record["name"] for record in result] with driver.session() as session: alice_name = session.read_transaction(get_person, "Alice") print(alice_name) # 輸出: ['Alice']driver.close()