夸克资源分享:
表情包:https://pan.quark.cn/s/5b9ddeb237fe
工具箱:https://pan.quark.cn/s/aa2d6a730482,图吧、美蛋、路遥、入梦等
Fiddler Everywhere抓包:https://pan.quark.cn/s/6b1e2fbae019,
Adobe:https://pan.quark.cn/s/13e39cfeaadb,先看安装教程
JetBranis开发者工具:https://pan.quark.cn/s/16e94dcff1f7,先看安装教程下的jetbra教程
逆向工具:https://pan.quark.cn/s/50e93c8ca54c
前端项目搭建集锦:https://blog.youkuaiyun.com/randy521520/article/details/146998467
一、Neo4j的基本概念与特点
Cypher 是 Neo4j 图数据库的专用查询语言,专为高效操作图数据而设计。它采用直观的语法结构,使得开发者能够轻松地表达复杂的图查询。
Neo4j 是一种专注于图数据存储与处理的数据库系统,特别擅长处理复杂的关系网络。与传统的表格型数据库相比,Neo4j 采用图结构来组织数据,通过Node(节点)和Relationship(关系)来构建数据模型。
节点(Node):节点是数据的基本单位,相当于传统数据库中的一行记录。每个节点可以携带多个属性,这些属性用于描述节点的特征。例如,一个代表用户的节点可能包含姓名、年龄、性别等属性。
关系(Relationship):关系是 Neo4j 中连接两个节点的纽带,类似于传统数据库中的外键,但功能更强大。关系具有方向性,可以明确表示从一个节点到另一个节点的关联。例如,用户节点和城市节点之间可以通过"居住于"关系连接,表示某用户居住在某个城市。
标签(Label):为了对节点进行分类,Neo4j 引入了标签的概念,这类似于传统数据库中的表。一个节点可以拥有多个标签,表示它属于多个类别。例如,一个节点可以同时拥有"用户"和"开发者"两个标签,表示该用户同时也是一名开发者。
属性(Property):属性不仅存在于节点上,也可以附加在关系上,用于存储额外的信息。这些属性可以是字符串、数字、日期等多种数据类型。例如,一个"购买"关系可以包含购买时间、购买数量等属性。
图(Graph):图是由节点和关系构成的网络结构,它直观地展现了数据之间的关联。Neo4j 的核心优势在于能够高效地处理复杂的图查询,这种能力在传统数据库中往往难以实现。通过这种图结构,Neo4j 能够更好地表达和处理现实世界中的复杂关系网络。
二、插入语法之CREATE
1.CREATE (n:Label {}):创建节点,n是节点的变量名,可以在后续查询中引用这个节点,变量不能重复
/****创建单个节点****/
CREATE(n);
CREATE(刘备);
/****创建带标签的节点****/
CREATE (n:Person)
/****动态创建label****/
WITH 'Person' AS lable
CREATE (n:$(lable))
/****创建节点多个标签****/
CREATE (刘备:Person:Leader:HistoricalFigure);
/****创建带属性的节点****/
CREATE (n:Person {name:"张三",age:18});
/****创建带属性的节点并返回****/
CREATE (刘备:Person {name: '刘备', title: '蜀汉昭烈帝'})
RETURN 刘备;
/****创建多个节点并返回****/
CREATE (刘备:Person {name: '刘备', title: '蜀汉昭烈帝'})
CREATE (关羽:Person {name: '关羽', title: '汉寿亭侯'})
RETURN 刘备;
CREATE (刘备:Person {name: '刘备', title: '蜀汉昭烈帝'}),
(关羽:Person {name: '关羽', title: '汉寿亭侯'})
RETURN 刘备;
2.CREATE (n:Label {}) -[r:Friend]-> (n:Label {}) 创建带关系的节点
/****-[r:Friend]->语法详解****/
<-:表示关系的方向,代表右边与左边的关系,<-从右节点指向左边节点、-无方向,
r:是系的变量名,可以在后续查询中引用这个关系,变量不能重复
:Friend:是关系的类型,表示这是一个Friend类型的关系
->:表示关系的方向,代表左边与右边的关系,->从左边节点指向右边节点、-无方向
/****该语法表明关羽是刘备的兄弟,但刘备不是关羽的兄弟****/
CREATE (刘备:Person {name:"刘备"}) <-[兄弟:Brother]- (关羽:Person {name:"关羽"});
/****该语法表明关羽是刘备的兄弟,已经八年****/
CREATE (刘备:Person {name:"刘备"}) <-[兄弟:Brother {time:'8年'}]- (关羽:Person {name:"关羽"});
/****该语法表明刘备是关羽的兄弟,但关羽不是刘备的兄弟****/
CREATE (刘备:Person {name:"刘备"}) -[兄弟:Brother]-> (关羽:Person {name:"关羽"});
/****该语法表明刘备和关羽互为兄弟****/
CREATE (刘备:Person {name:"刘备"})
<-[:Brother]- (关羽:Person {name:"关羽"})
CREATE (刘备)-[:Brother]->(关羽);
/****该语法表明刘备、关羽、张飞互为兄弟****/
CREATE (刘备:Person {name:"刘备"})
<-[:Brother]- (关羽:Person {name:"关羽"})
<-[:Brother]- (张飞:Person {name:"张飞"})
CREATE (刘备)-[:Brother]->(关羽)
CREATE (张飞)-[:Brother]->(关羽)
CREATE (张飞)-[:Brother]->(刘备)
CREATE (刘备)-[:Brother]->(张飞)
RETURN 刘备,张飞,关羽;
/****如果节点存在则创建关系****/
MATCH (刘备:Person {name:"刘备"}),(关羽:Person {name:"关羽"})
CREATE (刘备) -[兄弟:Brother]-> (关羽)
RETURN 兄弟;
3.CREATE CONSTRAINT:创建约束
/****创建唯一约束,约束该属性值是唯一的****/
CREATE CONSTRAINT ON (n:Label) ASSERT n.property IS UNIQUE;
/****创建唯一约束,约束该属性值是唯一的,自定义约束名称person_name****/
CREATE CONSTRAINT person_name_unique ON (p:Person) ASSERT p.name IS UNIQUE
/****创建存在约束,约束该属性必须存在****/
CREATE CONSTRAINT ON (n:Label) ASSERT EXISTS (n.property);
/****创建键存在约束,约束property1、property2组合的值是唯一的****/
CREATE CONSTRAINT ON (n:Label) ASSERT (n.property1, n.property2) IS NODE KEY;
/****删除指定的名称的约束****/
DROP CONSTRAINT constraint_name;
/****查看约束信息****/
SHOW CONSTRAINTS;
/****查看标签类型为Person的约束信息****/
SHOW CONSTRAINTSWHERE labelsOrTypes = 'Person';
/****查看某个名称的约束信息****/
SHOW CONSTRAINT constraint_name
三、查询语法MATCH
1.MATCH (n:Label {}) -[r:Friend]-> (n:Label {}):关系查询
/****查询指定标签的节点****/
MATCH (n) RETURN n;
/****查询指定标签的节点****/
MATCH (人:Person) RETURN 人;
/****查询动态指定标签的节点****/
WITH 'Person' AS label
MATCH (人:$(label)) RETURN 人;
/****查询指定标签和属性的节点****/
MATCH (刘备:Person {name:"刘备"}) RETURN 刘备;
/****查询所有刘备节点指向的关系节点****/
MATCH(刘备:Person{name:"刘备"}) -->(m) RETURN m;
/****查询所有刘备、赵云节点指向的关系节点****/
MATCH(刘备:Person{name:"刘备"}),(赵云:Person{name:"赵云"}) -->(m) RETURN m;
/****
该语法说明查询Person标签中name为刘备的节点,赋值给变量刘备
将查询到的所有节点指向的关系赋值给变量r
将查询到结果赋值给m,并返回m
****/
MATCH(刘备:Person{name:"刘备"}) -[r]-> (m) RETURN m;
/****查询所有指向刘备关系节点****/
MATCH (刘备:Person {name:"刘备"})<--(m) RETURN m
/****
该语法说明查询Person标签中name为刘备的节点,赋值给变量刘备
将查询到的所有指向节点的关系赋值给变量r
将查询到结果赋值给m,并返回m
****/
MATCH(刘备:Person{name:"刘备"}) <-[r]-(m) RETURN m;
/****查询所有与刘备有关系的节点****/
MATCH(刘备:Person{name:"刘备"}) -[r]-(m) RETURN m;
MATCH(刘备:Person{name:"刘备"}) --(m) RETURN m;
/****查询所有与刘备有关系Person节点,****/
MATCH(刘备:Person{name:"刘备"}) -[r]-(m:Person) RETURN m;
MATCH(刘备:Person{name:"刘备"}) --(m:Person) RETURN m;
/****查询所有与刘备有Brother关系节点,****/
MATCH(刘备:Person{name:"刘备"}) -[r:Brother]->(m) RETURN m;
/****查询所有与刘备有Brother关系节点,****/
MATCH(刘备:Person{name:"刘备"}) -[r:Brother]->(m) RETURN m;
/****查询所有与刘备有Brother或Friend关系节点,****/
MATCH(刘备:Person{name:"刘备"}) -[r:Brother|:Friend]->(m) RETURN r;
/****查询所有与刘备有Brother关系节点,并且该节点与另一个节点d有Brother****/
MATCH(刘备:Person{name:"刘备"}) -[:Brother]->(m)<-[:Brother]-(d) RETURN m,d;
/****
查询所有与刘备指向关系r的节点,赋值给m
再查询所有m节点指向关系k的节点,赋值给v
****/
MATCH(刘备:Person{name:"刘备"}) -[r]->(m)-[k]->(v) RETURN n,r,m,k,v;
2.[:TYPE*min…max]:层级深度查询
/****
先创建此数据,用于层级深度查询
该数据中刘备有四个节点
上面数据中1节点有:关羽、张飞
上面数据中2节点有:赵云、黄忠、马超、法正、刘封
上面数据中3节点有:陈到、霍峻、李严、张松、庞统黄权
上面数据中4节点有:王累、郑度、吴懿、张任
****/
CREATE (刘备:Person {name:"刘备", age: 50}),
(关羽:Person {name:"关羽", age: 45}),
(张飞:Person {name:"张飞", age: 43})
CREATE(刘备)-[:Brother{title:"二弟"}]-> (关羽)
CREATE(刘备)-[:Brother{title:"三弟"}]-> (张飞)
CREATE(关羽)-[:Friend{title:"朋友"}]-> (赵云:Person{name:"赵云", age: 40})
CREATE(关羽)-[:Friend{title:"朋友"}]-> (黄忠:Person{name:"黄忠", age: 65})
CREATE(关羽)-[:Friend{title:"朋友"}]-> (马超:Person{name:"马超", age: 38})
CREATE(张飞) -[:Friend{title:"朋友"}]-> (法正:Person{name:"法正", age: 42})
CREATE(张飞) -[:Friend{title:"朋友"}]-> (刘封:Person{name:"刘封", age: 35})
CREATE(赵云)-[:Friend{title:"朋友"}]-> (陈到:Person{name:"陈到", age: 38})
CREATE(赵云)-[:Friend{title:"朋友"}]-> (霍峻:Person{name:"霍峻", age: 37})
CREATE(赵云)-[:Friend{title:"朋友"}]-> (李严:Person{name:"李严", age: 45})
CREATE(法正)-[:Friend{title:"朋友"}]-> (张松:Person{name:"张松", age: 44})
CREATE(法正)-[:Friend{title:"朋友"}]-> (庞统:Person{name:"庞统", age: 36})
CREATE(法正)-[:Friend{title:"朋友"}]-> (黄权:Person{name:"黄权", age: 43})
CREATE(张松)-[:Friend{title:"朋友"}]-> (王累:Person{name:"王累", age: 50})
CREATE(张松)-[:Friend{title:"朋友"}]-> (郑度:Person{name:"郑度", age: 48})
CREATE(张松)-[:Friend{title:"朋友"}]-> (吴懿:Person{name:"吴懿", age: 47})
CREATE(张松)-[:Friend{title:"朋友"}]-> (张任:Person{name:"张任", age: 45});
/****查找与名为刘备的Person节点关系深度为2的节点****/
MATCH(刘备:Person{name:"刘备"}) -[*2]->(m) RETURN m;
/****查找与名为刘备的Person节点关系深度为2-3的节点****/
MATCH(刘备:Person{name:"刘备"}) -[r*2..3]->(result) RETURN result;
/****查找与名为刘备的Person节点中包括自己的所有节点****/
MATCH(刘备:Person{name:"刘备"}) -[r*0..]->(result) RETURN result;
/****查找与名为刘备的Person节点中不包括自己的所有节点***/
MATCH(刘备:Person{name:"刘备"}) -[r*0..]->(result) RETURN result;
/****查找与名为刘备的Person节点中不包括自己的Friend关系节点中标签为节点的Person标签***/
MATCH(刘备:Person{name:"刘备"}) -[r:Friend*0..]->(m:Person) RETURN m;
3.路径查询
/****查询刘备节点路径***/
MATCH p=(刘备:Person{name:"刘备"})-->() RETURN p;
/****查询具有一定深度的节点路径***/
MATCH p=(刘备:Person{name:"刘备"})-[*2..3]-() RETURN p;
/****查询刘备到赵云的最短路径shortestPath***/
MATCH (刘备:Person{name:"刘备"}),(赵云:Person{name:"赵云"}), p=shortestPath((刘备)-[*..15]-(赵云)) RETURN p;
/****查询刘备到赵云所有最短路径allShortestPaths***/
MATCH (刘备:Person{name:"刘备"}),(赵云:Person{name:"赵云"}), p=allShortestPaths((刘备)-[*..15]-(赵云)) RETURN p;
4.OPTIONAL MATCH:如果查询成功,返回相应的结果,如果查询失败,返回null而不是过滤掉整个结果
/****查询刘备可能存在的朋友,如果不存在则,b会返回null***/
MATCH (a:Person {name: "刘备"}) OPTIONAL MATCH(a)-[:Friend]->(b) RETURN b;
5.WHERE:条件件查询,可以使用AND、OR、NOT、IN、IS NOT、IS NULL等语法
/****查询Person标签下的所有节点***/
MATCH (n) WHERE n:Person RETURN n;
/****查询Person标签下name属性为刘备的节点***/
MATCH (n) WHERE n.name="刘备" RETURN n;
/****查询所有与刘备没有直接关系的节点***/
MATCH (n), (m{name: "刘备"}) WHERE NOT (n)-->(m)RETURN n;
/****查询所有name为刘备、赵云、法正的节点***/
MATCH (n) WHERE n.name IN ["刘备", "赵云","法正"] RETURN n;
/****查询所有id为1的节点**/
MATCH (n) WHERE id(n) = 1 RETURN n
/****查询所关系为Brother且关系title为二弟的关系***/
MATCH (n)-[r:Brother]->(m) WHERE r.title = "二弟" RETURN r,n,m;
6.LIMIT、UNION、ORDER BY
/****LIMIT:限制查询结果的数量***/
MATCH (n) LIMIT 10 RETURN n;
/****UNION:用于合并两个查询结果集,并去除重复行***/
MATCH (n) LIMIT 10
RETURN n
UNION
MATCH (n) LIMIT 10
RETURN n
/****UNION ALL用于合并两个查询结果集,不去除重复行***/
MATCH (n)
LIMIT 10
RETURN n
UNION ALL
MATCH (n)
LIMIT 10
RETURN n
/****OFFSET、SKIP:用于跳过查询结果中的前N行***/
MATCH (n) LIMIT 10 OFFSET 5 RETURN n;
/****ORDER BY:用于对查询结果进行排序***/
MATCH (n) LIMIT 10 ORDER BY n.age DESC RETURN n;
7.聚合函数
/****查询Person标签下刘备所有关系数量**/
MATCH (n:Person{name: "刘备"})-->(x) RETURN x, count(x) AS num_relationships;
MATCH (n:Person)-->(x) WHERE n.name = '刘备' RETURN x, count(x) AS num_relationships;
/****查询Person标签下所有节点年龄总和****/
MATCH (n:Person) RETURN SUM(n.age);
/****查询Person标签下所有节点平均年龄****/
MATCH (n:Person) RETURN AVG(n.age);
/****查询Person标签下所有节点最小年龄****/
MATCH (n:Person) RETURN MIN(n.age);
/****查询Person标签下所有节点最大年龄****/
MATCH (n:Person) RETURN MAX(n.age);
/****查询Person标签下所有节点年龄集合****/
MATCH (n:Person) RETURN COLLECT(n.age);
/****查询Person标签下名为zhangsan的节点指向的所有节点的不同年龄数量****/
MATCH (n:Person {name:"zhangsan"})-->(m) RETURN COUNT(DISTINCT m.age);
/****查询Person标签下所有节点年龄的中位数(离散值)****/
MATCH (n:Person) RETURN PERCENTILEDISC(n.age, 0.5);
/****查询Person标签下所有节点年龄的60百分位数(连续值)****/
MATCH (n:Person) RETURN PERCENTILECONT(n.age, 0.6);
/****查询Person标签下所有节点年龄的标准差(样本标准差)****/
MATCH (n:Person) RETURN STDEV(n.age);
/****查询Person标签下所有节点年龄的标准差(总体标准差)****/
MATCH (n:Person) RETURN STDEVP(n.age);
8.通过WITH、聚合函数实现GROUP BY
MATCH (p:Person)
WITH p.gender AS gender, COUNT(p) AS num_people
RETURN gender, num_people
四、插入语法之MERGE
1.MERGE (n:Label {}):创建节点,merge是match和create的结合,可以确保模式在graph中存在,如果不存在则创建
/****如果刘备存在返回刘备节点与刘备的标签,如果不存在则创建刘备,并返回刘备节点与刘备的标签****/
MERGE(刘备:Person {name: "刘备"}) RETURN 刘备, LABELS(刘备);
MERGE(刘备{name:"刘备"}) RETURN 刘备, LABELS(刘备);
2.MATCH MERGE:合并已存在节点的属性
/****查找名为刘备的Person节点,然后根据其名字创建或匹配一个City节点****/
MATCH (刘备:Person{name:"刘备") MERGE (城市:City{name:person.name}) return person, city
3.MERGE ON CREATE SET:节点不存在则创建节点,并设置属性。如果节点存在则不设置属性
/****查找名为刘备的Person节点,然后根据其名字创建或匹配一个City节点****/
MERGE (刘备:Person {name: "刘备"})
ON CREATE SET 刘备.created = timestamp()
RETURN 刘备;
4.MERGE ON MATCH SET:节点不存在则创建节点,不设置属性。如果节点存在则设置属性
MERGE (刘备:Person {name: "刘备"})
ON MATCH SET 刘备.created = timestamp()
RETURN 刘备;
5.MERGE ON CREATE SET ON MATCH SET:节点不存在则创建节点,并设置属性created。如果节点存在则设置属性age
MERGE (刘备:Person {name: "刘备"})
ON CREATE SET 刘备.created = timestamp()
ON MATCH SET 刘备.age = 18
RETURN 刘备;
6.MERGE关系
/****如果刘备与关羽之间无关系则创建关系****/
MATCH (刘备:Person {name: "刘备"}), (关羽:Person {name: "关羽"})
MERGE (刘备)-[r:Brother{title:"二弟"}]->(关羽)
RETURN r;
/****创建多个关系****/
MERGE (刘备:Person {name: "刘备"})
MERGE (关羽:Person {name: "关羽"})
MERGE (张飞:Person {name: "张飞"})
MERGE (刘备)-[:Brother {title: "二弟"}]->(关羽)
MERGE (刘备)-[:Brother {title: "三弟"}]->(张飞)
RETURN 刘备
五、修改语法SET
/****设置刘备节点的age属性为21****/
MATCH (刘备:Person {name:"刘备"}) SET 刘备.age=21 RETURN 刘备;
/****将刘备节点的age属性设置为null,neo4j不能设置null值,此举会删除age****/
MATCH (刘备:Person {name:"刘备"}) SET 刘备.age=NULL RETURN 刘备;
/****将刘备节点设置为新创建的Movie节点****/
MATCH (刘备:Person {name:"刘备"}), (电影:Movie{created:TIMESTAMP()}) SET 刘备=电影 RETURN 刘备,电影;
/****使用map语法更新刘备节点的属性****/
MATCH (刘备:Person {name:"刘备"}) SET 刘备+={age:18, sex:"男"} RETURN 刘备;
/****同时设置刘备节点的多个属性****/
MATCH (刘备:Person {name:"刘备"}) SET 刘备.age=21, 刘备.sex='男' RETURN 刘备;
/****为刘备节点添加Chinese标签****/
MATCH (刘备:Person{name:"刘备"}) SET 刘备:Chinese RETURN 刘备;
/****为刘备节点添加Chinese和Student标签****/
MATCH (刘备:Person{name:"刘备"}) SET n:Chinese:Student RETURN n;
六、删除语法delete、remove
1.DELETE:删除节点和关系
/****删除所有Person节点,但不删除其关系****/
MATCH (n:Person) DELETE n;
/****删除所有节点及其关系****/
MATCH (n) DETACH DELETE n;
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r;
/****删除刘备和关羽之间的路径****/
MATCH p=(d {name:"刘备"})--(e {name:"关羽"}) DELETE p;
/****删除名为张三的节点及其所有关系****/
MATCH (刘备{name:"刘备"}) DETACH DELETE 刘备;
/****删除名为刘备的Person节点及其所有关系****/
MATCH (刘备:Person {name:"刘备"})-[r]-() DELETE 刘备, r;
/****删除所有没有关系的孤立节点****/
MATCH (n) WHERE SIZE((n)--()) = 0 DELETE n;
2.REMOVE:删除属性和标签
/****删除刘备节点的age属性****/
MATCH (刘备:Person {name:"刘备"}) REMOVE 刘备.age RETURN 刘备;
/****删除刘备节点的Person标签****/
MATCH (刘备:Person {name:"刘备"}) REMOVE 刘备:Person RETURN 刘备;
/****删除刘备节点的Person和Student标签****/
MATCH (刘备:Person {name:"刘备"}) REMOVE 刘备:Person:Student RETURN 刘备;
/****清空刘备节点的所有属性****/
MATCH (刘备:Person {name:"刘备"}) SET 刘备={} RETURN 刘备;
七、批量导入LOAD CSV
LOAD CSV路径file:///heroes.csv 默认指向import目录,可以修改neo4j.con文件中的dbms.directories.import=/path/to/your/directory,neo4j.con通常在conf目录,也可以使用绝对路径,如:file:///C:/path/to/your/file.csv、https://neo4j.com/docs/cypher-manual/4.1/csv/artists.csv
/****实例数据,可根据需要处理成语法需要的数据****/
name,age,country,label,brothers,wives,children,friends
刘备,45,蜀国,蜀,关羽|张飞,甘夫人|糜夫人,刘禅|刘永|刘理,诸葛亮|赵云|庞统
关羽,42,蜀国,蜀,刘备|张飞,胡氏,关平|关兴|关索,张飞|赵云|黄忠
张飞,40,蜀国,蜀,刘备|关羽,夏侯氏,张苞|张绍|张遵,赵云|马超|黄忠
赵云,38,蜀国,蜀,,马氏,赵统|赵广|赵礼,诸葛亮|张飞|黄忠
诸葛亮,54,蜀国,蜀,,黄氏,诸葛瞻|诸葛怀|诸葛乔,刘备|赵云|庞统
曹操,50,魏国,魏,曹仁|曹洪,卞夫人|丁夫人,曹丕|曹植|曹彰,夏侯惇|荀彧|郭嘉
夏侯惇,48,魏国,魏,夏侯渊|夏侯霸,刘氏,夏侯楙|夏侯充|夏侯威,曹操|曹仁|荀彧
许褚,46,魏国,魏,,,许仪|许定|许攸,曹操|典韦|张辽
典韦,44,魏国,魏,,,典满|典杰|典义,许褚|张辽|夏侯惇
张辽,42,魏国,魏,,,张虎|张统|张雄,曹操|典韦|许褚
孙权,47,吴国,吴,孙策|孙翊,步夫人|徐夫人,孙登|孙和|孙亮,周瑜|鲁肃|吕蒙
周瑜,36,吴国,吴,,小乔,周循|周胤|周彻,孙权|鲁肃|吕蒙
鲁肃,38,吴国,吴,,,鲁淑|鲁芝|鲁钦,孙权|周瑜|吕蒙
吕蒙,40,吴国,吴,,,吕琮|吕霸|吕睦,孙权|周瑜|鲁肃
陆逊,35,吴国,吴,,孙氏,陆抗|陆景|V机,孙权|吕蒙|诸葛瑾
吕布,39,魏国,魏,,貂蝉,吕玲绮|吕英|吕雄,陈宫|高顺|张辽
貂蝉,28,魏国,魏,,,,吕布|王允|董卓
董卓,55,魏国,魏,,,董旻|董璜|董越,吕布|李儒|牛辅
袁绍,52,魏国,魏,袁术|袁遗,刘氏,袁谭|袁熙|袁尚,颜良|文丑|许攸
颜良,45,魏国,魏,,,,袁绍|文丑|高览
文丑,43,魏国,魏,,,,袁绍|颜良|高览
马超,37,蜀国,蜀,马岱|马休,杨氏,马承|马秋,张飞|赵云|黄忠
黄忠,60,蜀国,蜀,,,黄叙|黄舞蝶|黄崇,赵云|张飞|马超
魏延,45,蜀国,蜀,,,,诸葛亮|马超|黄忠
庞统,38,蜀国,蜀,,,,诸葛亮|刘备|徐庶
法正,40,蜀国,蜀,,,法邈刘备|诸葛亮|庞统
徐庶,42,蜀国,蜀,,,,诸葛亮|庞统|刘备
司马懿,50,魏国,魏,司马朗|司马孚,张氏,司马师|司马昭|司马干,曹操|曹丕|郭嘉
曹丕,35,魏国,魏,曹植|曹彰,甄氏,曹叡|曹霖|曹礼,司马懿|郭嘉|荀彧
张郃,45,魏国,魏,,,张雄|张统|张虎,曹操|夏侯惇|徐晃
徐晃,43,魏国,魏,,,徐盖|徐霸|徐商,曹操|张郃|夏侯惇
程昱,55,魏国,魏,,,程武|程延|程晓,曹操|荀彧|郭嘉
荀彧,50,魏国,魏,,,荀恽|荀俣|荀诜,曹操|程昱|郭嘉
贾诩,48,魏国,魏,,,贾穆|贾访|贾玑,曹操|郭嘉|荀彧
郭嘉,36,魏国,魏,,,郭奕|郭深|郭攸,曹操|荀彧|贾诩
太史慈,40,吴国,吴,,,太史享,孙权|周瑜|吕蒙
甘宁,38,吴国,吴,,,,孙权|周瑜|吕蒙
凌统,35,吴国,吴,,,凌烈|凌封|凌操,孙权|周瑜|吕蒙
周泰,37,吴国,吴,,,周邵|周承|周胤,孙权|吕蒙|凌统
韩当,50,吴国,吴,,,韩综|韩浩|韩嵩,孙权|程普|黄盖
程普,52,吴国,吴,,,程咨|程武|程延,孙权|韩当|黄盖
黄盖,55,吴国,吴,,,黄柄,孙权|程普|韩当
孙策,30,吴国,吴,孙权|孙翊,大乔,孙绍,周瑜|张昭|张纮
孙坚,48,吴国,吴,孙策|孙权,吴氏,孙策|孙权|孙翊,程普|黄盖|韩当
袁术,50,魏国,魏,袁绍|袁遗,冯氏,袁耀,纪灵|张勋|杨弘
纪灵,45,魏国,魏,,,,袁术|张勋|杨弘
1.LOAD CSV WITH HEADERS FROM:导入带heder的csv文件,通过header名获取每行的值
// 加载 CSV 文件并拆分字段
LOAD CSV WITH HEADERS FROM 'file:///heroes.csv' AS row
WITH row, row.label AS label,
split(row.brothers, '|') AS brothers,
split(row.wives, '|') AS wives,
split(row.children, '|') AS childrens,
split(row.friends, '|') AS friends
// 创建并设置主节点
MERGE (heroes { name: row.name })
SET heroes.age = row.age, heroes.country = row.country
FOREACH (ignore IN CASE WHEN label = '蜀' THEN [1] ELSE [] END |
SET heroes:蜀
)
FOREACH (ignore IN CASE WHEN label = '魏' THEN [1] ELSE [] END |
SET heroes:魏
)
FOREACH (ignore IN CASE WHEN label = '吴' THEN [1] ELSE [] END |
SET heroes:吴
)
// 处理兄弟关系
FOREACH (brotherName IN brothers |
MERGE (brother { name: brotherName })
MERGE (heroes)-[:Brother]->(brother)
)
// 处理妻子关系
FOREACH (wiveName IN wives |
MERGE (wive { name: wiveName })
MERGE (heroes)-[:Wive]->(wive)
)
// 处理孩子关系
FOREACH (childrenName IN childrens |
MERGE (child { name: childrenName })
MERGE (heroes)-[:Children]->(child)
)
// 处理朋友关系
FOREACH (friendName IN friends |
MERGE (friend { name: friendName })
MERGE (heroes)-[:Friend]->(friend)
)
2.LOAD CSV FROM :导入无头,通过下标获取每行的值
LOAD CSV FROM 'file:///heroesNoHeader.csv' AS row
WITH row, row[3] AS label,
split(row[4], '|') AS brothers,
split(row[5], '|') AS wives,
split(row[6], '|') AS childrens,
split(row[7], '|') AS friends
// 创建并设置主节点
MERGE (heroes { name: row[0] })
SET heroes.age = row[1], heroes.country = row[2]
FOREACH (ignore IN CASE WHEN label = '蜀' THEN [1] ELSE [] END |
SET heroes:蜀
)
FOREACH (ignore IN CASE WHEN label = '魏' THEN [1] ELSE [] END |
SET heroes:魏
)
FOREACH (ignore IN CASE WHEN label = '吴' THEN [1] ELSE [] END |
SET heroes:吴
)
// 处理兄弟关系
FOREACH (brotherName IN brothers |
MERGE (brother { name: brotherName })
MERGE (heroes)-[:Brother]->(brother)
)
// 处理妻子关系
FOREACH (wiveName IN wives |
MERGE (wive { name: wiveName })
MERGE (heroes)-[:Wive]->(wive)
)
// 处理孩子关系
FOREACH (childrenName IN childrens |
MERGE (child { name: childrenName })
MERGE (heroes)-[:Children]->(child)
)
// 处理朋友关系
FOREACH (friendName IN friends |
MERGE (friend { name: friendName })
MERGE (heroes)-[:Friend]->(friend)
)
3.FIELDTERMINATOR:指定分隔符,csv默认分割符是逗号,如果csv中的分割符为其他的,则需要指定分隔符\
LOAD CSV FROM 'file:///heroesNoHeader.csv' AS row FIELDTERMINATOR ';'
WITH row, row[3] AS label,
split(row[4], '|') AS brothers,
split(row[5], '|') AS wives,
split(row[6], '|') AS childrens,
split(row[7], '|') AS friends
// 创建并设置主节点
MERGE (heroes { name: row[0] })
SET heroes.age = row[1], heroes.country = row[2]
FOREACH (ignore IN CASE WHEN label = '蜀' THEN [1] ELSE [] END |
SET heroes:蜀
)
FOREACH (ignore IN CASE WHEN label = '魏' THEN [1] ELSE [] END |
SET heroes:魏
)
FOREACH (ignore IN CASE WHEN label = '吴' THEN [1] ELSE [] END |
SET heroes:吴
)
// 处理兄弟关系
FOREACH (brotherName IN brothers |
MERGE (brother { name: brotherName })
MERGE (heroes)-[:Brother]->(brother)
)
// 处理妻子关系
FOREACH (wiveName IN wives |
MERGE (wive { name: wiveName })
MERGE (heroes)-[:Wive]->(wive)
)
// 处理孩子关系
FOREACH (childrenName IN childrens |
MERGE (child { name: childrenName })
MERGE (heroes)-[:Children]->(child)
)
// 处理朋友关系
FOREACH (friendName IN friends |
MERGE (friend { name: friendName })
MERGE (heroes)-[:Friend]->(friend)
)
4.LIMIT:指定导入数量
LOAD CSV FROM 'file:///heroesNoHeader.csv' AS row
LIMIT 20
WITH row, row[3] AS label,
split(row[4], '|') AS brothers,
split(row[5], '|') AS wives,
split(row[6], '|') AS childrens,
split(row[7], '|') AS friends
// 创建并设置主节点
MERGE (heroes { name: row[0] })
SET heroes.age = row[1], heroes.country = row[2]
FOREACH (ignore IN CASE WHEN label = '蜀' THEN [1] ELSE [] END |
SET heroes:蜀
)
FOREACH (ignore IN CASE WHEN label = '魏' THEN [1] ELSE [] END |
SET heroes:魏
)
FOREACH (ignore IN CASE WHEN label = '吴' THEN [1] ELSE [] END |
SET heroes:吴
)
// 处理兄弟关系
FOREACH (brotherName IN brothers |
MERGE (brother { name: brotherName })
MERGE (heroes)-[:Brother]->(brother)
)
// 处理妻子关系
FOREACH (wiveName IN wives |
MERGE (wive { name: wiveName })
MERGE (heroes)-[:Wive]->(wive)
)
// 处理孩子关系
FOREACH (childrenName IN childrens |
MERGE (child { name: childrenName })
MERGE (heroes)-[:Children]->(child)
)
// 处理朋友关系
FOREACH (friendName IN friends |
MERGE (friend { name: friendName })
MERGE (heroes)-[:Friend]->(friend)
)
5.分批导入,处理大量数据时非常有用
/******
如果报错可将CALL函数的LOAD CSV删除,在顶部加上
:auto LOAD CSV FROM 'file:///heroes.csv' AS row
******/
CALL(){
LOAD CSV FROM 'file:///heroes.csv' AS row
LIMIT 20
WITH row, row[3] AS label,
split(row[4], '|') AS brothers,
split(row[5], '|') AS wives,
split(row[6], '|') AS childrens,
split(row[7], '|') AS friends
MERGE (heroes{name: row[0]})
ON MATCH SET heroes.age=row[1],heroes.country = row[2]
FOREACH (ignore IN CASE WHEN label = '蜀' THEN [1] ELSE [] END |
SET heroes:蜀
)
FOREACH (ignore IN CASE WHEN label = '魏' THEN [1] ELSE [] END |
SET heroes:魏
)
FOREACH (ignore IN CASE WHEN label = '吴' THEN [1] ELSE [] END |
SET heroes:吴
)
FOREACH (
brotherName IN brothers |
MERGE(haveHeores{name:brotherName}) ON CREATE SET haveHeores:Person
MERGE(heores) -[:Brother]-> (haveHeores)
)
FOREACH (
wiveName IN wives |
MERGE(haveHeores{name:wiveName}) ON CREATE SET haveHeores:Person
MERGE(heores) -[:Wive]-> (haveHeores)
)
FOREACH (
childrenName IN childrens |
MERGE(haveHeores{name:childrenName}) ON CREATE SET haveHeores:Person
MERGE(heores) -[:Children]-> (haveHeores)
)
FOREACH (
friendName IN friends |
MERGE(haveHeores{name:friendName}) ON CREATE SET haveHeores:Person
MERGE(heores) -[:Friend]-> (haveHeores)
)
} IN TRANSACTIONS OF 1000 ROWS;
6.linenumber():获取导入行数
LOAD CSV FROM 'file:///heroesNoHeader.csv' AS row
RETURN row[0] as name,linenumber() as number;
八、创建索引语法CREATE INDEX
列名描述数据类型值示例id索引的唯一标识符integername索引的名称stringstate索引的当前状态stringONLINE:索引已完全构建并可用,可以用于查询优化。POPULATING:索引正在构建中,尚未完成,此时索引不可用于查询优化。FAILED:索引构建失败,索引不可用,需要手动修复或重新创建。DELETED:索引已被删除,索引不再存在,无法使用。UNUSABLE:索引不可用,通常是由于底层数据或配置问题,需要手动修复或重新创建。populationPercent索引覆盖的总体百分比stringtype索引的类型stringFULLTEXT:全文索引,用于支持文本搜索,支持模糊匹配和分词搜索。LOOKUP:查找索引,用于加速节点或关系的查找操作。POINT:点索引,用于支持空间数据的查询,如地理位置。RANGE:范围索引,用于加速范围查询(如 >、<、BETWEEN)。TEXT:文本索引,用于支持精确的文本匹配查询。entityType索引所表示的实体类型stringNODE:节点索引,用于加速对节点的查询操作。RELATIONSHIP:关系索引,用于加速对关系的查询操作。labelsOrTypes索引关联的标签或关系类型listproperties索引所涉及的属性listindexProvider索引的提供程序stringnative-btree-1.0:基于 B 树的原生索引提供程序,支持精确匹配和范围查询。lucene+native-2.0:结合 Lucene 和原生实现的索引提供程序,支持全文搜索和复杂查询。text-1.0:文本索引提供程序,支持精确的文本匹配查询。point-1.0:点索引提供程序,支持空间数据的查询,如地理位置。range-1.0:范围索引提供程序,支持范围查询(如 >、<、BETWEEN)。owningConstraint与索引关联的约束名称stringlastRead索引最后一次被用于查找的时间datetimereadCount自跟踪开始以来索引被读取的次数integer
1.CREATE INDEXS:创建普通索引,为单个属性创建索引,加速基于该属性的查询;复合索引为多个属性创建索引,加速基于这些属性的联合查询
/****创建节点属性索引,为节点的Person标签属性name创建名为PersonNodePropNameIndex的索引****/
CREATE INDEX PersonNodePropNameIndex FOR (n:Person) ON (n.name);
/****创建节点复合属性索引,为节点的Person标签属性name、age创建名为PersonNodePropNameAndAgeIndex的复合属性索引****/
CREATE INDEX PersonNodePropNameAndAgeIndex FOR (n:Person) ON (n.name,n.age);
/****创建关系属性索引,为Brother关系属性name创建名为BrotherRelationPropNameIndex的索引*****/
CREATE INDEX BrotherRelationPropNameIndex FOR ()-[r:Brother]-() ON (r.name);
/****创建关系复合属性索引,为Brother关系属性name、date创建名为rotherRelationPropNameAndDateIndex的复合属性索引****/
CREATE INDEX BrotherRelationPropNameAndDateIndex FOR ()-[r:Brother]-() ON (r.name,r.date);
/****索引不存在,创建PersonNodePropNameIndex索引****/
CREATE INDEX PersonNodePropNameIndex IF NOT EXISTS FOR (n:Person) ON (n.name);
2.CREATE RANGE INDEXS:创建范围索引,为数值或日期属性创建范围索引,加速范围查询。
/****创建节点属性索引,为节点的Person标签属性age创建名为PersonAgeRangeIndex的索引****/
CREATE RANGE INDEX PersonAgeRangeIndex FOR (n:Person) ON (n.age);
/****创建关系属性索引,为Brother关系属性date创建名为BrotherRelationPropNameRangeIndex的索引*****/
CREATE RANGE INDEX BrotherRelationPropNameRangeIndex FOR ()-[r:Brother]-() ON (r.date);
/****索引不存在,创建PersonAgeRangeIndex索引****/
CREATE RANGE INDEX PersonAgeRangeIndex IF NOT EXISTS FOR (n:Person) ON (n.age);
3.CREATE TEXT INDEX:创建文本索引,为单个文本属性创建索引,特别是支持模糊搜索、前缀搜索和复杂文本匹配的场景。
/****创建节点属性索引,为节点的Person标签属性name创建名为PersonTextPropNameIndex的索引****/
CREATE TEXT INDEX PersonNodePropNameTextIndex FOR (n:Person) ON (n.name);
/****创建关系属性索引,为Brother关系属性name创建名为 BrotherRelationPropNameTextIndex索引*****/
CREATE TEXT INDEX BrotherRelationPropNameTextIndex FOR ()-[r:Brother]-() ON (r.name);
/****索引不存在,创建PersonNodePropNameTextIndex索引****/
CREATE TEXT INDEX PersonNodePropNameTextIndex IF NOT EXISTS FOR (n:Person) ON (n.name);
/****为TYPE关系的prop1属性创建文本索引,并指定索引提供程序****/
CREATE TEXT INDEX BrotherRelationPropNameTextIndexProvider FOR ()-[r:Brother]-() ON (r.name) OPTIONS {indexProvider: 'text-2.0'};
4.CREATE FULLTEXT INDEX:创建全文索引,为多个文本属性创建全文索引,支持模糊搜索和复杂文本查询。
/****创建节点属性索引,为节点的Person标签属性name、country创建名为PersonPropNameAndCountryFulltextIndex的索引****/
CREATE FULLTEXT INDEX PersonPropNameAndCountryFulltextIndex FOR (n:Person) ON EACH [n.name, n.country];
/****索引不存在,创建PersonPropNameAndCountryFulltextIndex索引****/
CREATE FULLTEXT INDEX PersonPropNameAndCountryFulltextIndex FOR (n:Person) ON EACH [n.name, n.country];
/****创建全文索引并指定分析器****/
CREATE FULLTEXT INDEX PersonPropNameAndCountryFulltextIndex FOR (n:Person) ON EACH [n.name, n.country]
OPTIONS {indexConfig: {`fulltext.analyzer`: 'english'}};
5.CREATE POINT INDEX:创建点索引,为地理空间属性(如 Point 类型)创建索引,加速地理空间查询。
/****创建节点属性索引,为节点的Person标签属性location创建名为PersonNodePropNamePointIndex的索引****/
CREATE POINT INDEX PersonNodePropNamePointIndex FOR (n:Person) ON (n.location);
/****创建关系属性索引,为Brother关系属性location创建名为BrotherRelationPropNameTextIndex索引*****/
CREATE POINT INDEX BrotherRelationPropNamePointIndex FOR ()-[r:Brother]-() ON (r.location);
/****索引不存在,创建PersonNodePropNamePointIndex索引****/
CREATE POINT INDEX PersonNodePropNamePointIndex IF NOT EXISTS FOR (n:Person) ON (n.location);
/****
为Person节点的prop2属性创建点索引,并指定索引配置:
spatial.cartesian.min:笛卡尔坐标系的最小范围,用于二维平面空间数据,默认值为 [-1000000.0, -1000000.0]。
spatial.cartesian.max:笛卡尔坐标系的最大范围,用于二维平面空间数据,默认值为 [1000000.0, 1000000.0]。
spatial.cartesian-3d.min:三维笛卡尔坐标系的最小范围,用于三维空间数据,默认值为 [-1000000.0, -1000000.0, -1000000.0]。
spatial.cartesian-3d.max:三维笛卡尔坐标系的最大范围,用于三维空间数据,默认值为 [1000000.0, 1000000.0, 1000000.0]。
spatial.wgs-84.min:WGS-84 坐标系的最小范围,用于地理空间数据(二维),默认值为 [-180.0, -90.0]。
spatial.wgs-84.max:WGS-84 坐标系的最大范围,用于地理空间数据(二维),默认值为 [180.0, 90.0]。
spatial.wgs-84-3d.min:三维 WGS-84 坐标系的最小范围,用于三维地理空间数据,默认值为 [-180.0, -90.0, -1000000.0]。
spatial.wgs-84-3d.max:三维 WGS-84 坐标系的最大范围,用于三维地理空间数据,默认值为 [180.0, 90.0, 1000000.0]。
****/
CREATE POINT INDEX PersonNodePropNamePointIndex
FOR (n:Person) ON (n.location)
OPTIONS {
indexConfig: {
`spatial.cartesian.min`: [-100.0, -100.0],
`spatial.cartesian.max`: [100.0, 100.0]
}
}
6.CREATE LOOKUP INDEX:创建令牌查找索引,为节点标签或关系类型创建索引,加速基于标签或类型的查询。
/****创建节点索引,为节点的Person标签所有属性创建名为PersonTokenIndex的索引****/
CREATE LOOKUP INDEX PersonTokenIndex FOR (n:Person) ON EACH labels(n);
/****创建关系索引,为Brother关系所有属性创建名为BrotherTokenInder索引*****/
CREATE LOOKUP INDEX BrotherTokenIndex FOR ()-[r:Brother]-() ON EACH type(r);
/****创建关系复合索引,为Brother关系所有属性创建名为NodeRelLookupIndex索引*****/
CREATE LOOKUP INDEX NodeRelLookupIndex FOR (n), ()-[r]-() ON EACH labels(n), EACH type(r);
/****索引不存在,为节点的Person标签创建查找索引****/
CREATE LOOKUP INDEX PersonTokenIndex IF NOT EXISTS FOR (n:Person) ON EACH labels(n);
7.SHOW INDEX:查找索引
/****查找索引,默认输出索引的所有列*****/
SHOW INDEXES
/****查找不同类型的索引*****/
SHOW RANGE INDEXS
SHOW TEXT INDEXES;
SHOW FULLTEXT INDEXES;
SHOW POINT INDEXES;
SHOW LOOKUP INDEXES;
/****查询索引部分列****/
SHOW INDEXES YIELD name, type;
/****条件查询索引***/
SHOW RANGE INDEXES WHERE owningConstraint IS NULL;
DROP INDEX index_name
DROP INDEX person_name_index
CREATE INDEX index_name FOR (n:Label) ON (n.prop1, n.prop2)
CREATE FULLTEXT INDEX index_name FOR (n:Label) ON EACH [n.prop1, n.prop2]
CREATE CONSTRAINT constraint_name FOR (n:Label) REQUIRE n.property IS UNIQUE
8.DROP INDEX:删除索引
/****删除索引****/;
DROP INDEX example_index;
/****如果存在则删除索引****/;
DROP INDEX missing_index_name IF EXISTS
1384

被折叠的 条评论
为什么被折叠?



