CRUD
创建
普通无属性创建(默认给你创建一个ID)
create (p:person)-[:eat]->(f:food)
带有属性的创建( {} )
create (p:person{name:'zhangsan'})-[:eat]->(f:food{name:'apple'})
给两个孤独的实体创建关系:
match
(a:animal),(c:color)
create (如果这里改为 merge 则是 “有则查询,无则创建”)
(a)-[h:have]->(c) return h
对应查询:
match
(a:animal),(c:color)
return a,c
删除 (delete)
match
(a:animal)-[h:have]->(c:color)
delete a,h,c
更新修改(set)
match
(f:food)
set f.age=20
查询
主体查询结构
match
(p:)-[:关系名]-[别名2:实体名]
return 别名1,别名2
普通条件查询1(whree)
match
(n:User)
where
n.name='Tom'
return n
普通条件查询2:( {} )
match
(p:person{name:'zhangsan'})-[:eat{level:1}]->(f:food{name:'apple'})
return p,f
正则条件查询(~)
match
(n:User)
where
n.name=~'T.*'
return n
包含条件查询(contains)
match
(n:User)
where
n.name contains 'T'
return n
多度查询
match (t:teacher)-[]-(s:student)-[]-(ss:score) return t,s,ss
# 注意1: [] 里面不写,代表所有关系
# 注意2: - 没有箭头,代表任意方向
# 注意3: 别名不可以重复指定, 所以我设置了 ss
多度关系: (通常是基于人脉来讲的)
1度关系:我 -> 你
2度关系:我 -> 你 -> 他
理解技巧: 算几度关系时,把自己(节点)捂住不看, 然后剩下几个人员节点,就是几度关系
特别注意:
多度查关系时,比如你查 3度关系的结果。
neo4j的图可能会把, 2度关系也画出来,why? 因为他通过2度关系也可直接得出结果。
(可理解为 条条大路通罗马。)
!!!但是最终有效的返回路径只是你最初想要的 3度。 (2度就不算了)
查询最短路径:
match (t:teacher), (s:student),
p=shortestpath( (t)-[*..]-(s) )
return p
# 注意: p= 之前有个逗号 ,
查询所有最短路径:
match (t:teacher), (s:student),
p=allshortestpaths( (t)-[*..]-(s) )
return p
# 注意1: 前面多个 all ,后面多个s
# 注意2: 所有最短路径的都会列出来。 人人平等~
索引
创建索引 (create)
create index on :food(name)
# food为实体名,name为属性名, 同时注意这个 :
删除索引(drop)
drop index on :food(name)
约束
创建约束
create constraint on (gf:girlfriend) assert (gf.name) is unique
删除约束
create constraint on (o:others) assert (o.name) is unique
聚合
统计个数(count)
match ... return count(别名)
限制取多少条 (limit)
match ... return 别名 limit 5 # 只取5条
知识图谱流程
- 数据抓取
- 知识模型设计
- NER (远程监督)
- 关系抽取(Bootstrap)
- 知识推理
- 图谱存储(Neo4j Cypher)
- 检索/问答/推荐
实体抽取
BILSTM+CRF
关系抽取
Bootstrap方法:
1. 构建种子实体: "猫", "老鼠"。
2. 寻找包含 "猫" "老鼠" 的 句子:
找到句子:"猫和老鼠是好朋友"
可抽取关系: 和...是好朋友
3. 拿着抽取的关系再次寻找新句子:
找到新句子:"张三和里李四是好朋友"
提取出新实体: "张三", "李四"
4. 寻找包含 "张三" "李四" 的 句子:
找到句子:"张三经常和李四一起玩"
可抽取关系: 经常和... 一起玩
5. 拿着抽取的关系再次寻找新句子:
找到新句子:"王五和赵六是好朋友"
提取出新实体: "王五", "赵六"
...
...
循环反复