網(wǎng)站天天做收錄有效果嗎google中文搜索引擎入口
Neo4j
文章目錄
- Neo4j
- CQL
- 結(jié)點(diǎn)和關(guān)系
- 增刪改查
- 匹配語句
- 根據(jù)標(biāo)簽匹配節(jié)點(diǎn)
- 根據(jù)標(biāo)簽和屬性匹配節(jié)點(diǎn)
- 刪除
- 導(dǎo)入數(shù)據(jù)
- 目前的問題
- 菜譜
- 解決的問題
命令行窗口 neo4j.bat console
導(dǎo)入rdf格式的文件
:GET /rdf/ping
CALL n10s.graphconfig.init(); //初始化
call n10s.rdf.import.fetch("file:///F:\\wow.rdf",'Turtle')// 導(dǎo)入注意斜杠///(本地文件需要用這個(gè))
清空所有數(shù)據(jù)
這里要注意的是,因?yàn)椴淮嬖诠铝⒌年P(guān)系,所以若要?jiǎng)h除一個(gè)帶關(guān)系的節(jié)點(diǎn),需要同時(shí)刪除該節(jié)點(diǎn)所有的關(guān)系。
即,若要?jiǎng)h除路徑(a)-[d]-(b)-[e]-(c)
中的 a,b 節(jié)點(diǎn),則需要同時(shí)刪除關(guān)系 d,e。
因此,若要清空數(shù)據(jù)庫,即刪除所有的節(jié)點(diǎn)和關(guān)系,可以先使用 MATCH
找到所有的節(jié)點(diǎn),再使用 OPTIONAL MATCH
查詢節(jié)點(diǎn)是否存在關(guān)系,最后將其全部刪除。
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
return
因?yàn)?CREATE
命令可以允許不跟 RETURN
同時(shí)使用,若使用了 RETURN
,才會返回 Graph
界面
CQL
Neo4j的Cypher語言是為處理圖形數(shù)據(jù)而構(gòu)建的,CQL代表Cypher查詢語言。像Oracle數(shù)據(jù)庫具有查詢 語言SQL,Neo4j具有CQL作為查詢語言。
結(jié)點(diǎn)和關(guān)系
Cypher 采用一對圓括號 ()
來表示節(jié)點(diǎn),如 (n:角色)
表示一個(gè) 角色
節(jié)點(diǎn),n
是變量名,供命令執(zhí)行時(shí)用 n
來訪問這個(gè)節(jié)點(diǎn),在命令執(zhí)行完畢后就無法使用了。同時(shí)單獨(dú)的 ()
表示一個(gè)匿名節(jié)點(diǎn),在匹配時(shí)表示匹配所有節(jié)點(diǎn)。
在關(guān)系中
--
表示無方向的關(guān)系-->
表示有方向的關(guān)系-[r]->
則給關(guān)系賦予一個(gè)變量名,方便對這個(gè)關(guān)系進(jìn)行操作-[r:配偶]->
匹配關(guān)系為配偶
的類型
增刪改查
//建立結(jié)點(diǎn)
create(n:Person{name:"小江",sex:"男"}) return n
//建立關(guān)系 (小江是小王的爸爸)
MATCH(a:Person{name:"小江"}),(b:Person{name:"小王"})Merge(a)-[r:爸爸]->(b)
//創(chuàng)建節(jié)點(diǎn)的時(shí)候就建立好關(guān)系
CREATE (a:Person {name:'苗同學(xué)'})-[r:朋友]->(b:Person {name:'葉同學(xué)'})
//修改 把name是小王的name改成小江
Match (a:Person{name:"小王"})set a.name="小江"
//搜索 信息是大學(xué)生的,返回改結(jié)點(diǎn)
match(a:Person{info:"大學(xué)生"}) return a
//在一個(gè)結(jié)點(diǎn)中建立新的屬性,在名字為小陳這個(gè)結(jié)點(diǎn)添加info屬性
match (a:Person{name:"小陳"}) set a.info="小學(xué)生"
//刪除結(jié)點(diǎn)的某個(gè)屬性
match (a:Person{name:"小陳"}) remove a.info
//刪除關(guān)系
match(a:Person{name:"小陳"})-[r:`爸爸`]-(b:Person{name:"江"}) delete r
//刪除結(jié)點(diǎn) To delete this node, you must first delete its relationships.刪除結(jié)點(diǎn)前要先刪除關(guān)系
match (a:Person{name:"小江"}) delete a
merge
與create
的區(qū)別
可以認(rèn)為 MERGE = MATCH + CREATE
,因此,在對圖數(shù)據(jù)進(jìn)行添加時(shí),若想要跳過已存在的節(jié)點(diǎn)或關(guān)系,使用 MERGE
命令,若不關(guān)心重復(fù)節(jié)點(diǎn)或關(guān)系,則使用 CREATE
命令
匹配語句
-
根據(jù)標(biāo)簽匹配節(jié)點(diǎn)
//匹配所有角色節(jié)點(diǎn) match (n:角色) return n
-
根據(jù)標(biāo)簽和屬性匹配節(jié)點(diǎn)
// 匹配 name 為 郭靖 的 角色 節(jié)點(diǎn)
match (n:角色{name:'郭靖'}) return n
刪除
Neo4j 中有兩種刪除方法,DELETE
和 REMOVE
。DELETE
用于刪除節(jié)點(diǎn)和關(guān)系,REMOVE
用于刪除節(jié)點(diǎn)和關(guān)系的標(biāo)簽與屬性。兩者都需要配合 MATCH
,先匹配到內(nèi)容,再執(zhí)行操作。
刪除節(jié)點(diǎn)
若要?jiǎng)h除節(jié)點(diǎn),則需要?jiǎng)h除與節(jié)點(diǎn)相關(guān)的所有邊,這與圖論一致——不存在沒有節(jié)點(diǎn)的邊。 因此要?jiǎng)h掉金輪法王這個(gè)節(jié)點(diǎn),就先需要找到該節(jié)點(diǎn)和所在關(guān)系,再進(jìn)行刪除
match(n:`角色`{name:"王重陽"})-[r]-() delete n,r
導(dǎo)入數(shù)據(jù)
load csv with headers from 'file:///data\\射雕三部曲.csv' as line
match (book:作品),(person:角色),(skill:武功)wherebook.name in split(line.作品, ',') andperson.name = line.人物 andskill.name in split(line.武功, ',')
optional match (father:角色)wherefather.name = line.父
optional match (mother:角色)wheremother.name = line.母
optional match (spouse:角色)wherespouse.name = line.配偶
optional match (sect:門派)wheresect.name = line.門派
optional match (children:角色)wherechildren.name in split(line.子女, ',')
optional match (master:角色)wheremaster.name in split(line.師傅, ',')
merge (person)-[:所在作品]-(book)
merge (person)-[:師傅]-(master)
merge (person)-[:武功]-(skill)
merge (person)-[:父]-(father)
merge (person)-[:母]-(mother)
merge (person)-[:配偶]->(spouse)
merge (person)-[:所在門派]-(sect)
merge (person)-[:子女]-(children)
目前的問題
1.高血壓最重要的營養(yǎng)素是鉀和鈉,但是我們之前那個(gè)數(shù)據(jù)里面是沒有鉀元素的
兩個(gè)數(shù)據(jù),分開建圖是可以的,但是合起來不行欸
我的想法是先建立原料和營養(yǎng)的圖,然后再建立菜和原料的圖,如果這個(gè)原料有的話,就連接過去
可以建立類別,然后富含的話可以放在鉀元素那里,還有少量,放在鈉元素,其他的話要有含量吧,寫在關(guān)系中嗎
菜譜
load csv with headers from 'file:///data\\export.csv' as line
merge(n:食物{name:line.食物名,kind:line.分類}) return n
create(n:營養(yǎng)素{name:"鈉"}) return n //建立營養(yǎng)素
解決的問題
1.新版的python連接圖數(shù)據(jù)庫的寫法
網(wǎng)上很多都是這個(gè),但是我會報(bào)錯(cuò)
graph = Graph("http://localhost:7474", username="root", password='123456')
原因是python版本問題,下面這個(gè)是正確的寫法
graph = Graph('http://localhost:7474', auth=("neo4j", "123456"))
2.報(bào)錯(cuò):UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaa in position
就是編碼方式的問題
with open("D:\\neo4j-community-4.4.14-windows\\neo4j-community-4.4.14\\import\\data\\export.csv", 'r',encoding='utf-8') as f:
最后要加上enconding='utf-8’就可以了
match (a:nutrients)-[:富含]-(b:recipe_matrial{name:"生菜"})-[:include]-(c:recipe) return a,b,c
match (a:recipe{name:"螞蟻上樹"})-[:include]-(b:recipe_matrial)-[:have]-(c) return a,b,c
match(a:食材{name:{foodName}})-[:推薦食用]-(b:疾病) return a,b
查找缽缽雞的所有關(guān)系,但是只有一層
match (n:recipe{name:"螞蟻上樹"})--(b) return n,b
兩層關(guān)系
match (n:recipe{name:"螞蟻上樹"})--(b)-->(c) return n,b,c
match n=(x:recipe)-[*1..2]-() where x.name="缽缽雞" return n
如果是直接通過菜找營養(yǎng)素的話,就沒有鈉含量了
如果通過菜找食材再找營養(yǎng)素的話,這兩個(gè)數(shù)據(jù)是分開的,有些食材在另一個(gè)數(shù)據(jù)里是沒有的
if question_type == 'disease_cause':sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause".format(i) for i in entities]