小言_互联网的博客

neo4j的增删改查CQL笔记(一)

412人阅读  评论(0)

参照的资料链接:史上超全面的Neo4j使用指南

1,Neo4j CQL创建一个没有属性的节点

CREATE (<node-name>:<label-name>)

语法说明
label-name规范说法是节点标签名称,其实相当于Mysql数据库中的表名,而node-name是节点名称,其实代指创建的此行数据的行头。#S#标签没有值,用于分类节点(此标签下的节点可生成一张表),属性有键值对 ,node-name只是一个函数名的作用,不储存在数据库中。直译就是:我建个标签为label-name的节点a(node-name),所以create指令中node-name可以省略

示例

CREATE (emp:Employee)

或者

CREATE (:Employee)

Neo4j CQL创建具有属性的节点

它创建一个具有一些属性(键值对)的节点来存储数据。
#S#经测试多个同名属性kvp只会储存一个,值为最后一个的值,即属性名唯一

CREATE (
   <node-name>:<label-name>
   {    
      <key>:<Value>
      ........
      <n-key>:<n-Value>
   }
)

示例

CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

创建多个标签到节点

语法:

CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)

示例

CREATE (m:Movie:Cinema:Film:Picture)

创建一个标签分别为Movie:Cinema:Film:Picture的节点

CREATE ({name:"wuming"})

创建无标签只有属性的命令
增加已有节点的属性和标签待测试

2.MATCH查询
Neo4j CQL MATCH命令用于,
从数据库获取有关节点和属性的数据
从数据库获取有关节点,关系和属性的数据
MATCH命令语法:

MATCH 
(
   <node-name>:<label-name>
)

示例

MATCH (dept:Dept)

但是执行后会报错:

Neo.ClientError.Statement.SyntaxError:
Query cannot conclude with MATCH
(must be RETURN or an update clause) (line 1, column 1 (offset: 0))
如果你观察到错误消息,它告诉我们,我们可以使用MATCH命令与RETURN子句或UPDATA子句。

3.RETURN返回
Neo4j CQL RETURN子句用于 -

检索节点的某些属性
检索节点的所有属性
检索节点和关联关系的某些属性
检索节点和关联关系的所有属性
RETURN命令语法:

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>

示例

MATCH (e:Employee) RETURN e

#S#这里e是搜索结果的容器,Employee是搜索的标签内容

MATCH (dept: Dept)
RETURN dept.deptno,dept.dname,dept.location

#S#这里直接返回Dept这个标签下节点的各个属性的值
测试:
再建立一个Dept标签的不同节点(节点名竟然可省略)

CREATE (dept66:Dept { deptno:66,dname:"Accounting66",location:"Hyderabad66" })

再执行此命令试试
结果:
可以看出,就是一个没有行名的表。。。
再次证明dept66就是一个函数名

按属性查询

MATCH (n { name: "name1233" })
RETURN n

可查询到属性name值为name1233的节点
4.关系基础

Neo4j图数据库遵循属性图模型来存储和管理其数据。

根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。

基于方向性,Neo4j关系被分为两种主要类型。

单向关系
双向关系
使用新节点创建关系

示例

CREATE (e:Employee)-[r:DemoRelation]->(c:Employee)

这句会创建节点e,节点c,以及e -> c的关系r,这里需要注意方向,比如双向是

CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee)

#S#这个双向测试失败Neo.ClientError.Statement.SyntaxError: Only directed relationships are supported in CREATE (line 1, column 20 (offset: 19))
“CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee)”
查了几个资料
Neo4J:创建双向关系
Neo4j数据建模优化:双向关系
再测试添加一个反向

CREATE (e:Employee)<-[r:DemoRelation]-(c:Employee)

成功又创建了一对单向关系
结论:箭头可以这么用,但是不能同时用(不知道为啥会有这么明显的坑待填)

使用已知节点创建带属性的关系:

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)//感觉应该是<tmp1-name>:<label-name>),(<tmp2-name>:<labe2-name>
CREATE  
    (<node1-label-name>)-[<relationship-label-name>:<relationship-name>//<tmp1-name>-[<relationship-tmp-name>:<relationship-label-name>
    {<define-properties-list>}]->(<node2-label-name>)
    //  {<属性键值对list>}]->(<tmp2-name>)
RETURN <relationship-label-name>
//RETURN <relationship-tmp-name>
//这两句原文很乱,label-name应该是真正的名字tmp是函数名

示例

MATCH (cust:Customer),(cc:CreditCard) 
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc) 
RETURN r

#S#这里用之前有的两个节点

MATCH (cust:Employee),(cc:Dept) 
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc) 
RETURN r

结果:

就是这么一团玩意…

结论:
neo4j中不指定节点的话,会对所有符合条件的节点进行操作=。=

检索关系节点的详细信息:

MATCH 
(<node1-label-name>)-[<relationship-label-name>:
//(<node1-tmp-name>)-[<relationship-tmp-name>:
<relationship-name>]->(<node2-label-name>)
//<relationship-name>]->(<node2-tmp-name>)
RETURN <relationship-label-name>
//RETURN <relationship-tmp-name>

示例

MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) 
RETURN cust,cc

直译:返回有这个DO_SHOPPING_WITH关系的节点
测试:r没用到可不可以省略 结果:可以。

这点东西搞这么麻烦。。。这个世界坑可不可以少一点
下一篇WHERE吧


转载:https://blog.csdn.net/weixin_42832191/article/details/104763128
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场