網(wǎng)站天天做收錄有效果嗎google中文搜索引擎入口
Neo4j
文章目錄
- Neo4j
- CQL
- 結(jié)點和關(guān)系
- 增刪改查
- 匹配語句
- 根據(jù)標簽匹配節(jié)點
- 根據(jù)標簽和屬性匹配節(jié)點
- 刪除
- 導入數(shù)據(jù)
- 目前的問題
- 菜譜
- 解決的問題
命令行窗口 neo4j.bat console
導入rdf格式的文件
:GET /rdf/ping
CALL n10s.graphconfig.init(); //初始化
call n10s.rdf.import.fetch("file:///F:\\wow.rdf",'Turtle')// 導入注意斜杠///(本地文件需要用這個)
清空所有數(shù)據(jù)
這里要注意的是,因為不存在孤立的關(guān)系,所以若要刪除一個帶關(guān)系的節(jié)點,需要同時刪除該節(jié)點所有的關(guān)系。
即,若要刪除路徑(a)-[d]-(b)-[e]-(c)
中的 a,b 節(jié)點,則需要同時刪除關(guān)系 d,e。
因此,若要清空數(shù)據(jù)庫,即刪除所有的節(jié)點和關(guān)系,可以先使用 MATCH
找到所有的節(jié)點,再使用 OPTIONAL MATCH
查詢節(jié)點是否存在關(guān)系,最后將其全部刪除。
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
return
因為 CREATE
命令可以允許不跟 RETURN
同時使用,若使用了 RETURN
,才會返回 Graph
界面
CQL
Neo4j的Cypher語言是為處理圖形數(shù)據(jù)而構(gòu)建的,CQL代表Cypher查詢語言。像Oracle數(shù)據(jù)庫具有查詢 語言SQL,Neo4j具有CQL作為查詢語言。
結(jié)點和關(guān)系
Cypher 采用一對圓括號 ()
來表示節(jié)點,如 (n:角色)
表示一個 角色
節(jié)點,n
是變量名,供命令執(zhí)行時用 n
來訪問這個節(jié)點,在命令執(zhí)行完畢后就無法使用了。同時單獨的 ()
表示一個匿名節(jié)點,在匹配時表示匹配所有節(jié)點。
在關(guān)系中
--
表示無方向的關(guān)系-->
表示有方向的關(guān)系-[r]->
則給關(guān)系賦予一個變量名,方便對這個關(guān)系進行操作-[r:配偶]->
匹配關(guān)系為配偶
的類型
增刪改查
//建立結(jié)點
create(n:Person{name:"小江",sex:"男"}) return n
//建立關(guān)系 (小江是小王的爸爸)
MATCH(a:Person{name:"小江"}),(b:Person{name:"小王"})Merge(a)-[r:爸爸]->(b)
//創(chuàng)建節(jié)點的時候就建立好關(guān)系
CREATE (a:Person {name:'苗同學'})-[r:朋友]->(b:Person {name:'葉同學'})
//修改 把name是小王的name改成小江
Match (a:Person{name:"小王"})set a.name="小江"
//搜索 信息是大學生的,返回改結(jié)點
match(a:Person{info:"大學生"}) return a
//在一個結(jié)點中建立新的屬性,在名字為小陳這個結(jié)點添加info屬性
match (a:Person{name:"小陳"}) set a.info="小學生"
//刪除結(jié)點的某個屬性
match (a:Person{name:"小陳"}) remove a.info
//刪除關(guān)系
match(a:Person{name:"小陳"})-[r:`爸爸`]-(b:Person{name:"江"}) delete r
//刪除結(jié)點 To delete this node, you must first delete its relationships.刪除結(jié)點前要先刪除關(guān)系
match (a:Person{name:"小江"}) delete a
merge
與create
的區(qū)別
可以認為 MERGE = MATCH + CREATE
,因此,在對圖數(shù)據(jù)進行添加時,若想要跳過已存在的節(jié)點或關(guān)系,使用 MERGE
命令,若不關(guān)心重復(fù)節(jié)點或關(guān)系,則使用 CREATE
命令
匹配語句
// 匹配 name 為 郭靖 的 角色 節(jié)點
match (n:角色{name:'郭靖'}) return n
刪除
Neo4j 中有兩種刪除方法,DELETE
和 REMOVE
。DELETE
用于刪除節(jié)點和關(guān)系,REMOVE
用于刪除節(jié)點和關(guān)系的標簽與屬性。兩者都需要配合 MATCH
,先匹配到內(nèi)容,再執(zhí)行操作。
刪除節(jié)點
若要刪除節(jié)點,則需要刪除與節(jié)點相關(guān)的所有邊,這與圖論一致——不存在沒有節(jié)點的邊。 因此要刪掉金輪法王這個節(jié)點,就先需要找到該節(jié)點和所在關(guān)系,再進行刪除
match(n:`角色`{name:"王重陽"})-[r]-() delete n,r
導入數(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)素是鉀和鈉,但是我們之前那個數(shù)據(jù)里面是沒有鉀元素的
兩個數(shù)據(jù),分開建圖是可以的,但是合起來不行欸
我的想法是先建立原料和營養(yǎng)的圖,然后再建立菜和原料的圖,如果這個原料有的話,就連接過去
可以建立類別,然后富含的話可以放在鉀元素那里,還有少量,放在鈉元素,其他的話要有含量吧,寫在關(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)上很多都是這個,但是我會報錯
graph = Graph("http://localhost:7474", username="root", password='123456')
原因是python版本問題,下面這個是正確的寫法
graph = Graph('http://localhost:7474', auth=("neo4j", "123456"))
2.報錯: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)素的話,這兩個數(shù)據(jù)是分開的,有些食材在另一個數(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]