图数据库主要用于存储更多的连接数据。例如这样的数据。一个人的家庭群,和他的朋友圈模型。
像这样,这些应用程序包含大量的结构化,半结构化和非结构化的连接数据。 在RDBMS数据库中表示这种非结构化连接数据并不容易。使用RDBMS数据库来存储更多连接的数据,那么它们不能提供用于遍历大量数据的适当性能。 在这些情况下,Graph Database提高了应用程序性能。
Neo4j图数据库遵循属性图模型来存储和管理其数据。
这里我们使用圆圈表示节点。 使用箭头的关系。 关系是有方向性的。 我们可以用Properties(键值对)来表示Node的数据。 在这个例子中,我们在Node的Circle中表示了每个Node的Id属性。
下载 https://neo4j.com/download/
//解压
tar -xf neo4j-community-3.4.10-unix.tar.gz
//启动
/bin/neo4j start
//后台启动
nohup bin/neo4j start >> /tmp/neo4j.log 2>&1 &
CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。下面我们来实际操作一波。
访问http://localhost:7474/browser/ 进入控制台。
密码默认是neo4j,登录过后会让你修改密码
CREATE (abel:Abel{name:"yang",age:26,phone:133333})
此命令已创建一个具有3个属性(“name”,“age”,“phone”)的节点名称“abel”,并分配了一个标签“Abel”。
可以创建多个 节点名称、节点标签、所有属性及属性值都相同的节点。
在Neo4j中,内部有个Id属性,“Id”是节点和关系的默认内部属性。 这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。
我们需要使用MATCH命令与RETURN子句查询或更新子句
MATCH (abel:Abel) RETURN abel //查询节点全部信息
MATCH (abel:Abel) RETURN abel.name // 查询节点的name属性值
RETURN子句。我们应该既MATCH使用或CREATE命令。
关系是定向的基于方向性,Neo4j关系被分为两种主要类型。
在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
在两个现有节点之间创建无属性的关系
在两个现有节点之间创建与属性的关系
在两个新节点之间创建无属性的关系
在两个新节点之间创建与属性的关系
在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
每个关系(→)包含两个节点
先再创建一个节点 CREATE (an:an{name:“an”,sex:“女”})
//无属性的关系
MATCH (an:an),(abel:Abel) CREATE (an) - [l:love] ->(abel)
//有属性的关系 stopdate 为属性名
MATCH (an:an),(abel:Abel) CREATE (an) - [l:love{stopdate:12/12/2100}] ->(abel)
已有两个节点 an 和 abel 创建关系,关系名称为love 关系标签为 l 方向为 an 到 abel
//无属性的新节点到已有节点创建无属性关系
MATCH(abel:Abel) CREATE (tian:tian)-[like:LIKES]->(abel)
//有属性的新节点到已有节点创建无属性关系
MATCH(abel:Abel) CREATE (tian:tian{name:"tians",age:23,sex:"女"})-[like:LIKES]->(abel)
//有属性的新节点到已有节点创建有属性的关系
MATCH(abel:Abel) CREATE (tian:tian{name:"tians",age:23,sex:"女"})-[like:LIKES{stopdate:12/12/2100}]->(abel)
//无属性的新节点到新节点创建无属性关系
CREATE (TT:tian)-[like:LIKES]->(long:LONG)
//有属性的新节点到新节点创建无属性关系
CREATE (TT:tian{name:"tians",age:24,sex:"女"})-[like:LIKES]->(long:LONG{name:"long",age:25,sex:"男"})
//无属性的新节点到新节点创建有属性关系
CREATE (TT:tian{name:"tians",age:24,sex:"女"})-[like:LIKES{stopdate:12/12/2100}]->(long:LONG{name:"long",age:25,sex:"男"})
支持的布尔运算符 AND,OR,NOT,XOR 支持以下的比较运算符 =,<>,<,>,<=,>=
MATCH(TT:tian),(long:LONG) WHERE TT.age>23 RETURN TT,long
如果删除的节点有关系的话得先删除关系
//删除关系
MATCH (TT:tian)-[like]-(long:LONG) DELETE like
//删除节点
MATCH(TT:tian) DELETE TT
//也可以与where 结合使用
MATCH(TT:tian) where TT.age>23 RETURN TT
有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。
我们使用Neo4j CQL SET子句向现有节点或关系添加新属性。
我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
###DELETE和REMOVE命令之间的主要区别
两个命令都应该与MATCH命令一起使用。
使用逗号(,)运算符来分隔标签名称列表。使用dot(。)运算符来分隔节点名称和标签名称。
//删除节点的属性sex
MATCH(TT:tian) REMOVE TT.sex RETURN TT
//
MATCH(long:LONG) REMOVE long:Picture
我们需要向现有节点或关系添加新属性。
//节点添加属性,多个属性中间用, 隔开
match(a:a) set a.phone =234324234234 return a
//“ORDER BY”子句,对MATCH查询返回的结果进行排序。可以按升序或降序进行排序。
MATCH (abel:Abel) RETURN abel order by abel.age DESC
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
neo4j 还支持 UNION ,UNION ALL,LIMIT,skip,MERGE,IS NOT NULL,in等关键字
创建节点
//创建两个节点无属性,创建关系无属性,
$ CREATE (abel:NAME)-[name:colleague]->(eiva:NAME) RETURN abel,eiva
//创建节点有属性,创建关系有属性
$ CREATE (abel:column{id:2,name:'abel'})-[name:colleague{id:1,name:'colleague'}]->(eiva:NAME{id:221,name:'eiva'}) RETURN abel,eiva
查询指定节点
//查询节点类型为 column ,id =221的节点
$ MATCH (n:column) where n.id = 221 RETURN n LIMIT 1
//查询节点类型为 column ,id =221节点的名字属性
$ MATCH (n:column{id:221}) RETURN n.name LIMIT 1
//查询节点类型为 column ,id =222 和 id =2 的节点
$ MATCH (n:column{id:2}), (y:column{id:222}) RETURN n,y LIMIT 1
查询两个现有节点创建关系
//现有节点 创建无属性关系
//查询两个类型为column且 id = 2 和 id =221 的节点,并创建 n -> x 的关系 dataRel,关系类型为 DATA。并返回 n 和 x 节点
$ MATCH (n:column{id:2}), (x:column{id:221}) create (n)-[dataRel:DATA]->(x) RETURN n,x LIMIT 1
//当然也可以只创建不返回
$ MATCH (n:column{id:2}), (x:column{id:221}) create (n)-[dataRel:DATA]->(x)
//现有节点 创建有属性关系
//查询两个类型为column且 id = 2 和 id =221 的节点,并创建 n -> x 的关系 dataRel,关系类型为 DATA,属性为 id 和 name。并返回 n 和 x 节点
$ MATCH (n:column{id:2}), (x:column{id:222}) create (n)-[dataRel:DATA{id:1,name:'数据'}]->(x) RETURN n,x LIMIT 1
//查询多层节点关系,通过当前国王的名字查询下一任国王和皇后
match p=(a:King)-[r:`传位`]->(b:King)-[r2:`皇后`*1..]->(c:Queen) where a.name ='朱祁镇' return p
更新信息
//更新节点信息
MATCH (n:column{id:2}) SET n.comment = '测试数据'
//更新关系 (关系有唯一id)
MATCH (n)-[r:BusinessRelation{id:'rel_col_88'}]->(y) set r.comment= '测试2' RETURN n,y LIMIT 25
//更新关系 多个属性
MATCH (n)-[r:BusinessRelation{id:'rel_col_88'}]->(y) set r.comment= '测试2', r.type= 2 RETURN n,y LIMIT 25
//更新关系信息,关系无唯一id
MATCH (n:BusinessColumn{id:'col_1'}),(y:BusinessColumn{id:'col_2'}) MATCH (n)-[r:BusinessRelation{name:'测试'}]->(y) set r.comment= '测试1' RETURN n,y LIMIT 25
删除关系
//删除一个关系
Match (n)-[r:BusinessRelation{id:'rel_col_88'}]-(y) delete r
清空数据库
//删除节点
MATCH (n:King) DELETE n
//删除关系和节点
MATCH (n:King)-[r]-() DELETE n,r
springboot-neo4j 示例代码 点我
包含 springboot-data-neo4j 和 Cypher 语言操作两种方式
参考:https://www.w3cschool.cn/neo4j/neo4j_id_property.html