MATCH(a:director),(b:film) WHERE a.name='弗兰克·德拉邦特' AND b.name='肖申克的救赎' CREATE(a)-[r:direct]->(b)
创建电影和演员关系的命令:
1 2 3 4 5 6 7 8 9 10 11
MATCH(a:actor),(b:film) WHERE a.name='张国荣' AND b.name='霸王别姬' CREATE(a)-[r:play]->(b) MATCH(a:actor),(b:film) WHERE a.name='蒂姆罗宾斯' AND b.name='肖申克的救赎' CREATE(a)-[r:play]->(b) MATCH(a:actor),(b:film) WHERE a.name='张丰毅' AND (b.name='霸王别姬' or b.name='荆轲刺秦王') CREATE(a)-[r:play]->(b)
查询节点与关系
查询某个电影
1 2 3
MATCH(a:film) WHERE a.name='霸王别姬' RETURN a
查询某个标签下的所有节点
1 2
MATCH(a:director) RETURN a
查询两个节点间的关系
1
MATCH(:director {name:'弗兰克·德拉邦特'})-[r]->(:film {name:'肖申克的救赎'}) RETURN r
-- 如果删除的节点还有对应关系存在,那么我们无法删除,需要先删除关系后才能和删除节点 MATCH(a:actor) DELETE a
删除所有节点
1 2 3
-- 同上一样要注意关系 MATCH(n) DELETE n
删除两个节点的关系
1 2
MATCH(:actor{name:'张国荣'})-[r]->(:film{name:'霸王别姬'}) DELETE r
删除某节点相关的关系
1 2
MATCH(:actor{name:'张国荣'})-[r]->() DELETE r
删除某个标签全部的关系
1 2
MATCH ()-[r]->(:film) DELETE r
属性相关操作
增加节点属性
1 2
MATCH (n:film) WHERE n.name='盗梦空间' SET n.language='english'
删除节点属性
1 2
MATCH (n:film) WHERE n.name='盗梦空间' REMOVE n.language
neo4j批量构建节点和关系
案例2:股票数据批量导入知识图谱
stock.csv文件
name
code
大兴安岭
100
麻辣兔头
101
哈哈教育
102
exchange.csv文件
name
ch_name
code
华北强证券交易所
huabeiqiang
1
小道观证券交易所
xiaodaoguan
2
stock_exchange.csv文件
stock_code
exchange_code
100
2
101
2
102
1
1.首先把数据文件放到neo4j的对应数据库的import文件下
接着返回neo4j网页,导入数据,根据exchange文件导入exchange节点数据:
1 2
load csv with headers from 'file:///exchange.csv' as line create(:exchange{name:line.name, ch_name:line.ch_name, code:line.code})
导入股票节点:
1 2
load csv with headers from 'file:///stock.csv' as line create(:stock{name:line.name, code:line.code})
基于stock_exchange.csv文件批量构建节点关系
1 2 3
load csv with headers from 'file:///stock_exchange.csv' as line match (a:stock{code:line.stock_code}),(b:exchange{code:line.exchange_code}) create(a)-[r:交易所]->(b)
-- *..2返回与小北在二级关系内的节点 -- 注意这个时候关系`-`没有箭头 match(:Person{name:'小北'})-[*..2]-(n) return n
查找两个人间最短路径
1 2 3 4
-- '*'表示路径范围是不限的,会遍历所有路径去找最短路径 match n=shortestPath((:Person{name:'小Y'})-[*]->(:Person{name:'小明'})) return n -- *..6:事先知道最长路径不会超过六度关系,让其在六度关系内查找最短路径,缩小搜索范围 match n=shortestPath((:Person{name:'小Y'})-[*..6]->(:Person{name:'小明'})) return n
查找相关联的人并确保此人至少有两个外向关系
1 2 3 4 5 6 7
// otherPerson是目标要查找的人 match (:Person{name:'小明'})--(otherPerson)-->() // with作为管道,将otherPerson变量传递下去,count(*)指的是`-->()`有多少种关系,查找otherPerson关系并计数 with otherPerson,count(*) as relations // where过滤符合条件的 where relations > 1 return otherPerson
//把账户人1、账户人2、账户人3关联到地址1上 match (a:AccountHolder),(b:Address) where a.UniqueId='JaneAppleseed' and b.ZipCOde='94101' create(a)-[r:HAS_ADDRESS]->(b) match (a:AccountHolder),(b:Address) where a.UniqueId='JohnDoe' and b.ZipCOde='94101' create(a)-[r:HAS_ADDRESS]->(b) match (a:AccountHolder),(b:Address) where a.UniqueId='MattSmith' and b.ZipCOde='94101' create(a)-[r:HAS_ADDRESS]->(b)
//把账户1、账户2关联到电话号码1上 match (a:AccountHolder),(b:PhoneNumber) where a.UniqueId='JohnDoe' and b.PhoneNumber='555-555-555' create(a)-[r:HAS_PHONENUMBER]->(b) match (a:AccountHolder),(b:PhoneNumber) where a.UniqueId='JaneAppleseed' and b.PhoneNumber='555-555-555' create(a)-[r:HAS_PHONENUMBER]->(b)
//创建社会安码 SSN1 create (ssn1:SSN{ SSN:"241-23-1234" }) ; //把账户人2、账户人3关联到SSN1 match (a:AccountHolder),(b:SSN) where a.UniqueId='JaneAppleseed' and b.SSN='241-23-1234' create(a)-[r:HAS_SSN]->(b) ; match (a:AccountHolder),(b:SSN) where a.UniqueId='MattSmith' and b.SSN='241-23-1234' create(a)-[r:HAS_SSN]->(b) ; //创建社会安全码SSN2 关联到账户人1 create (ssn2:SSN{SSN:"241-23-4567"}) ; match (a:AccountHolder), (b:SSN) where a.UniqueId='JohnDoe' and b.SSN='241-23-4567' create (a)-[:HAS_SSN]->(b)
//创建无抵押贷款2并关联到账户人2 create (unsecuredLoan2:UnsecureLoan{ AccountNumber:'4567890123456789-0', Balance:90453, APR:0.0541, LoanAmount:12000 }) ; match (a:AccountHolder), (b:UnsecureLoan) where a.UniqueId='JaneAppleseed' and b.AccountNumber='4567890123456789-0' create (a)-[:HAS_UNSECUREDLOAN]->(b) ; //创建无抵押贷款3并关联到账户人3 create (unsecuredLoan3:UnsecureLoan{ AccountNumber:'5678901234567890-0', Balance:16341.95, APR:0.0341, LoanAmount:22000 }) ; match (a:AccountHolder), (b:UnsecureLoan) where a.UniqueId='MattSmith' and b.AccountNumber='5678901234567890-0' create (a)-[:HAS_UNSECUREDLOAN]->(b) ; //创建电话号码3 并关联到账户3 create (phoneNumber2:PhoneNumber {PhoneNumber:'555-555-1234' }) ; match (a:AccountHolder), (b:PhoneNumber) where a.UniqueId='MattSmith' and b.PhoneNumber='555-555-1234' create (a)-[:HAS_UNSECUREDLOAN]->(b) ;
检测1
查找共享多个合法信息的帐户持有人,共同信息越多,所说明此欺诈环越可疑,并按欺诈环的大小排序。
1 2 3 4 5 6 7 8 9 10
// 匹配所有与账户所有者有联系的节点 match (a:AccountHolder)-[]->(b) // 对当前节点,统计当前节点连接的账户,将连接当前节点的账户去重收集 with b,count(a) as RingSize,collect(distinct a.UniqueId) as FraudRing // 过滤小于1的 where RingSize>1 // 返回结果,labels(b):节点b的类别 return FraudRing,labels(b) as ContractType,RingSize // 按照RingSize降序排列 order by RingSize desc
检测2
查找共享多个合法信息的帐户持有人,并查询其可能的金融风险,并按风险大小排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 匹配所有与账户所有者有联系的节点 match (a:AccountHolder)-[]->(b) // 对当前节点b,统计连接当前节点b的账户所有者数,并把a,b变量通过管道传递下去 with b, count(a) as RingSize // 继续匹配a->b所有关系 match (a)-[]->(b), // 查找匹配a、c两节点是信用卡和信用贷款关系的 (a)-[r:HAS_CREDITCARD|HAS_UNSECUREDLOAN]->(c) // 收集去重账户所有者id, 节点变量b, 管道传下来的变量RingSize,并将这些变量传到下层管道 with collect(distinct a.UniqueId) as FraudRing,b,RingSize, // sum(...) as FinancialRisk 整个语句就是我们要传到下层的金融分析管道变量之一 sum (case type(r) when 'HAS_CREDITCARD' then c.Limit when 'HAS_UNSECUREDLOAN' then c.Balance else 0 end) as FinancialRisk where RingSize>1 return FraudRing,labels(b) as ContractType,RingSize,round(FinancialRisk) as FinancialRisk order by FinancialRisk desc