Neo4j的特点

SQL一样容易查询语言的Neo4j CQL

它遵循属性图数据模型

它通过使用Apache Lucence支持索引

它支持UNIQUE约束

它包含一个UI执行CQL指令:Neo4j的数据浏览器

它支持完整的ACID(原子性,一致性,隔离性和持久性)规则

它采用原生图形库与本地GPE(图形处理引擎)

它支持查询的数据导出到JSON和XLS格式

它提供了REST API由如Java,春天,斯卡拉等任何编程语言进行访问

它提供了Java Script支持以任何UI MVC框架如Node JS进行访问。

它支持两种类型的Java API:Cypher支架API和本地Java API来开发Java应用程序。

Neo4j的优势

这是很容易以表示连接数据。

这是很容易和更快的检索更多的数据/遍历/导航。

它表示半结构化数据变得非常容易。

Neo4j的CQL查询语言命令在人性化的可读格式,非常简单易学。

它使用简单,功能强大的数据模型。

它不需要复杂的连接来获取连接/相关的数据,因为它是非常方便地检索它的相邻节点或关系的细节没有加入或索引。

创建节点

Neo4j的CQL“Create”命令使用不带属性来创建节点。 它只是创造没有任何数据的节点。

CREATE命令语法
CREATE (:)
语法说明

语法元素 描述
创建 这是一个Neo4j的定制列表命令。
<节点名称> 这是我们要创建一个节点名称。
<标签名称> 这是一个节点的标签名称
要记住的事情 -

Neo4j的数据库服务器使用该<节点名称>以存储Database.As一个Neo4j的DBA或开发该节点的详细信息,我们不能用它来访问节点的详细信息。

Neo4j的数据库服务器创建一个<标签名称>作为别名到内部节点name.As一个Neo4j的DBA或开发人员,我们应该利用这个标签名称访问节点的详细信息。

创建一个简单的“雇员”节点

1
CREATE (emp:Employee)

创建一个简单的“部门”节点

1
CREATE (dept:Dept)

Neo4j的CQL创建节点具有属性

Neo4j的CQL“Create”命令用于创建具有属性节点。 它创建了一些属性(键 - 值对)来存储数据的节点。

CREATE命令语法:
CREATE (
:
{
:
……..
:
}
)
语法说明

语法元素 描述
<节点名称> 这是我们要创建一个节点名称。
<标签名称> 这是一个节点的标签名称

<Property1名> … <propertyN中名称> 属性是键 - 值对。 定义了将要分配给创建节点的属性的名称

<Property1值> … <propertyN中值> 属性是键 - 值对。 定义了将要分配给一个创建节点的属性的值

创建一个部门节点的一些属性(DEPTNO,DNAME,位置)

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

在这里,属性名称是DEPTNO,DNAME,位置

属性值是10,“会计学”,“海得拉巴”

正如我们所讨论的,属性的名称 - 值对。

属性= DEPTNO:10

由于DEPTNO是一个整数属性,所以我们没有使用单引号或双引号来界定它的价值10。

由于DNAME和位置都是String类型的属性,所以我们使用了单引号或双引号来界定它的价值10。

创建具有某些属性(ID,姓名,SAL,DEPTNO)劳动者节点

1
CREATE (emp:Employee{id:123,name:"Lokesh",sal:35000,deptno:10})

这里是EMP节点名称

员工是部门节点的标签名称
新增1标签,创建1个节点,设置4个属性,返回0行

此命令创建一个节点“EMP”有4个属性(“ID”,“姓名”,“萨尔”,“DEPTNO”),并分配一个标签“雇员”。

match命令

Neo4j的CQL MATCH命令用于 -

要获取有关数据库节点和属性数据
要获得有关节点,从数据库中的关系和属性数据

MATCH命令语法:

MATCH
(
:
)
语法说明

语法元素 描述
<节点名称> 这是我们要创建一个节点名称。
<标签名称> 这是一个节点的标签名称
要记住的事情 -

Neo4j的数据库服务器使用该<节点名称>以存储Database.As一个Neo4j的DBA或开发该节点的详细信息,我们不能用它来访问节点的详细信息。

Neo4j的数据库服务器创建一个<标签名称>作为别名到内部节点name.As一个Neo4j的DBA或开发人员,我们应该利用这个标签名称访问节点的详细信息。

注-我们不能用match命令只身从数据库中检索数据。 如果我们只使用它,那么我们将InvalidSyntax错误。

return子句

Neo4j的CQL RETURN子句用于 -

要检索节点的一些特性
要检索节点的所有属性
要检索节点和关联关系的一些性质
要检索节点和关联关系的所有属性

返回的命令语法:

RETURN
.,
……..
.
语法说明

语法元素 描述
<节点名称> 这是我们要创建一个节点名称。

<Property1名> … <propertyN中名称> 属性是键 - 值对。 <属性名称>定义了将要分配给创建节点的属性的名称

MATCH及return

在Neo4j的CQL,我们不能用MATCH或RETURN单独命令,所以我们要结合这两个命令来检索数据库中的数据。

Neo4j的CQL MATCH + RETURN命令用于 -

要检索节点的一些特性
要检索节点的所有属性
要检索节点和关联关系的一些性质
要检索节点和关联关系的所有属性

匹配返回命令语法:

MATCH Command
RETURN Command
语法说明

语法元素 描述
match命令 这是Neo4j的CQL MATCH命令。
返回指令 这是Neo4j的CQL RETURN命令。
MATCH命令语法:
MATCH
(
:
)
语法说明

语法元素 描述
<节点名称> 这是我们要创建一个节点名称。
<标签名称> 这是一个节点的标签名称
要点 -

Neo4j的数据库服务器使用该<节点名称>以存储Database.As一个Neo4j的DBA或开发该节点的详细信息,我们不能用它来访问节点的详细信息。

Neo4j的数据库服务器创建一个<标签名称>作为别名到内部节点name.As一个Neo4j的DBA或开发人员,我们应该利用这个标签名称访问节点的详细信息。

返回的命令语法:

RETURN
.,

.
语法说明

语法元素 描述
<节点名称> 这是我们要创建一个节点名称。

<Property1名> … <propertyN中名称> 属性是键 - 值对。 定义了将要分配给创建节点的属性的名称

检索一些属性(DEPTNO,DNAME)从数据库部节点的数据。

1
2
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname

dept是一个节点名
Dept是部节点标签名称
deptno是部门节点的属性名称
dname是部门节点的属性名称

检索所有属性(DEPTNO,DNAME,位置)从数据库部节点的数据

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

dept是一个节点名
Dept是部节点标签名称
DEPTNO是部门节点的属性名称
DNAME是部门节点的属性名称
location是部门节点的属性名称

如何在没有指定其属性从数据库中检索部节点的数据

1
2
MATCH (dept: Dept)
RETURN dept

CREATE + MATCH + RETURN

创建两个节点与两个节点之间的属性和关系。

我们将创建两个节点:客户和信用卡式人际关系。

  • 客户节点包含:ID,姓名,出生日期属性

  • 信用卡式节点包括:身份证,号码,CVV,性能EXPIREDATE

  • 客户信用卡式的关系:DO_SHOPPING_WITH

  • 要的信用卡客户关系:ASSOCIATED_WITH

步骤:

  1. 创建客户节点
  2. 创建信用卡式节点
  3. 观察先前创建的两个节点:客户和信用卡式
  4. 创建客户与信用卡式节点之间的关系
  5. 查看新创建的关系的细节
  6. 详细查看每个节点和关系属性

创建客户节点

1
CREATE (e:Customer{id:"1001",name:"Abc",dob:"01/10/1982"})
  • e 是一个节点名
  • Custoomer 是一个节点的标签名称
  • id,name,dob 是客户节点的属性名称

创建信用卡式节点

‘’’’
CREATE (c:CreditCard{id:”5001”,number:”1234567890”,cvv:”888”,expiredate:”20/17”})

‘’’’

  • c是一个节点名

  • CreditCard是一个节点的标签名称

  • 身份证,号码,CVV和EXPIREDATE是信用卡式节点的属性名称

观察节点

我们已经创建了两个节点:客户和信用卡式,我们需要通过使用带有RETURN子句的Neo4j CQL MATCH命令来查看这两个节点的详细信息

1
2
MATCH (e:Customer)
RETURN e.id,e.name,e.dob

查看信用卡式节点详细信息

1
2
MATCH (c:CreditCard)
RETURN c.id,c.number,c.cvv,c.expiredate

基本关系

Neo4j的图形数据库如下属性图模型来存储和管理数据。

按物业图模型,关系应该是方向性的。 否则,Neo4j的将抛出一个错误消息。

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

单向关系
双向关系
我们可以用Neo4j的CQL create命令创建在以下情况下两个节点之间的关系。 这些方案都适用于两个单向及双向关系。

创建两个现有节点之间没有特性的关系

创建两个现有节点之间,属性关系

创建两个新的节点之间没有特性的关系

创建两个新的节点之间,属性关系

用WHERE子句2退出节点之间创建/关系没有属性

我们要创造客户和信用卡式如下之间的关系

关系是一种“传出的关系”向“信用卡式的”节点和相同的关系是“传入的关系”的“客户”节点。

我们创建了“信用卡式”和“客户”之间的节点两个关系:一是由“信用卡式”的“客户”。 另一名来自“客户”向“信用卡式”。 这意味着它是双向的关系。

  • 创建无属性的关系随着现有节点

  • 创建关系具有属性随着现有节点

  • 无属性有了新节点创建关系

  • 创建关系具有属性有了新节点

  • 检索相关节点的详细信息

创建节点标签

标签是一个名称或标识节点或在Neo4j的数据库的关系。

我们可以说此标签名称为“关系类型”的关系。

我们可以使用定制列表create命令创建一个标签节点或关系与多个标签节点。 这意味着Neo4j的支持两个节点之间只有单一的关系类型。

我们可以在这两种UI模式和网格模式CQL数据浏览器中观察此节点的或关系的标签名称。 同时,我们也参照执行其命令CQL。

到目前为止,我们只创建一个标签,一个节点或有关系,但是我们并没有讨论关于它的语法了。
Neo4j的CQL CREATE命令用于

  • 要创建一个单独的标签节点

  • 要创建多个标签节点

  • 要创建一个单独的标签有关系

如何在本章中创建一个节点一个或多个标签。 我们将讨论如何创建一个单一的标签,以在下一章节的关系。

单个标签到节点

句法
CREATE (:)

S.No. 语法元素 描述
1。 创建 这是一个Neo4j的CQL关键字。
2。 <节点名称> 它是一个节点的名称。
3。 <标签名称> 这是一个节点的标签名称。

注意

  • 我们应该用冒号(:)运营商的节点名称和标签名称分开。
  • Neo4j的数据库服务器使用此名称来存储这个节点细节Database.As一个Neo4j的DBA或开发人员,我们不能用它来访问节点的详细信息

  • Neo4j的数据库服务器创建一个标签名称作为别名到内部节点name.As一个Neo4j的DBA或开发人员,我们应该利用这个标签名称访问节点的详细信息。

1
CREATE (google1:GooglePlusProfile)

我们可以观察到一个标签和一个节点在Neo4j的数据库中创建。

多个标签节点

句法

CREATE (::…..:)

S.No. 语法元素 描述
1。 创建 这是一个Neo4j的CQL关键字。
2。 <节点名称> 它是一个节点的名称。
3。 <标签名1>,<标签名2> 它是一个节点的标签名称的列表。

注意

  • 我们应该用冒号(:)运营商的节点名称和标签名称分开。
  • 我们应该用冒号(:)运营商一个标签名称分开到另一个标签名称。

创建多个标签名称为“电影”节点。

影院,影片,电影,图片:由我们的客户端提供多标签名称

单个标签有关系

句法

CREATE (:)-
[(:)]
->(:)

语法说明
S.No. 语法元素 描述
1。 创建 这是一个Neo4j的CQL关键字。
2。 <节点1名> 这是一个从节点的名称。
3。 <节点2名> 这是A到节点的名称。
4。 <LABEL1名称> 这是一个从节点的标签名称。
5。 <LABEL1名称> 这是一个到节点的标签名称。
6。 <关系名称> 它是一个关系的一个名字。
7。 <相关标签名称> 这是一个关系的标签名称。

注意

  • 我们应该用冒号(:)运营商的节点名称和标签名称分开。
  • 我们应该用冒号(:)运营商的关系,名称和关系标签名称分开。
    • 我们应该用冒号(:)运营商一个标签名称分开到另一个标签名称。
    • Neo4j的数据库服务器使用此名称来存储这个节点细节Database.As一个Neo4j的DBA或开发人员,我们不能用它来访问节点的详细信息
    • Neo4j的数据库服务器创建一个标签名称作为别名到内部节点name.As一个Neo4j的DBA或开发人员,我们应该利用这个标签名称访问节点的详细信息。

如何创建一个标签,一个关系

1
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)
  • p1和Profile1的都是“从节点”的节点名称和节点标签名称
  • P2和Profile2的都是的“节点”节点名称和节点标签名称
  • R1是有关系的名字,喜欢是有关系的标签名称

WHERE子句

简单的WHERE子句语法
WHERE
复杂的WHERE子句语法
WHERE
我们可以通过使用布尔运算符将多个条件对同样的命令。 详情请参阅在Neo4j的CQL可用的布尔运算符下一节。

<条件>的语法:


语法说明

S.No. 语法元素 描述
1。 哪里 这是一个Neo4j的CQL关键字。
2。 <属性名称> 这是一个节点或关系的属性名。
3。 <比较运算符> 这是Neo4j的CQL比较operators.Please的一个是指在Neo4j的CQL可用比较运营商下一节。
4。 <值> 这就像一些文字,字符串文字等文本值

何使用WHERE CQL在match命令子句检索基于员工的名字雇员的详细信息。

1
2
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
1
2
3
MATCH (emp:Employee) 
WHERE emp.name = 'Abc'
RETURN emp
1
2
3
MATCH (emp:Employee) 
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp

创建WHERE子句的关系

在Neo4j的CQL,我们可以创建不同的方法拖车节点之间的关系。

  • 创建两个现有的节点之间的关系

  • 一次创建它们之间的两个节点和关系

  • 创建WHERE子句两个已存在节点之间的关系

我们已经讨论了在前面章节前两种方法。 现在,我们将在本章中的“创建具有WHERE子句两个已存在节点之间的关系”的讨论

句法
MATCH (:),(:)
WHERE
CREATE ()-[:
{}]->()

S.No. 语法元素 描述
1。 MATCH,WHERE,CREATE 他们是Neo4j的CQL关键字。
2。 <节点1标签名称> 它是用于创建关系的节点有一个标签名称。
3。 <节点1名> 它是用于创建关系一个节点一个名称。
4。 <节点2标签名称> 它是用于创建关系的节点有一个标签名称。
5。 <节点2名> 它是用于创建关系一个节点一个名称。
6。 <条件> 这是一个Neo4j的CQL WHERE子句条件。 它可以是简单的或复杂的。
7。 <相关标签名称> 这是新创建的节点之一,节点两者之间关系的标签名称。
8。 <关系名称> 这是新创建的节点之一,节点两者之间关系的一个名字。
9。 <关系的属性> 这是新创建的节点之一,节点两者之间关系的属性列表(键 - 值对)。
1
2
3
4
MATCH (cust:Customer),(c:CreditCard) 
WHERE cust.id = "1001" AND c.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(c)
RETURN r

删除

DELETE子句用于

要删除一个节点。
要删除一个节点和相关节点和关系。

删除节点 -
通过使用此命令,我们可以从数据库中永久删除节点及其相关属性。

删除节点子句子语法
|||

DELETE

S.No. 语法元素 描述
1。 删除 这是一个Neo4j的CQL关键字。
2。 <节点名称列表> 它是节点名,它会从数据库中删除的列表。

删除节点和关系子句语法

DELETE ,,

S.No. 语法元素 描述
1。 删除 这是一个Neo4j的CQL关键字。
2。 <节点1名> 它是用于创建关系<关系名称>一端节点名称。
3。 <节点2名> 它是用于创建关系<关系名称>另一个节点名称。
4。 <关系名称> 这是一个关系名,这是<节点1-name>和<节点2名>之间产生。

从数据库中永久删除节点及其联营节点和关系。

1
MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r

观察为客户一个节点,对于信用卡式的一个节点和它们之间的关系可用。

1
2
MATCH (cc: CreditCard)-[rel]-(c:Customer) 
DELETE cc,c,rel

观察到两个节点及其相关联的10关系成功删除。

1
MATCH (cc:CreditCard)-[r]-(c:Customer) RETURN r

现在检查DELETE操作是否成功还是没有这样做,发现数据库中没有任何记录。

remove

基于我们客户的需求,我们需要从现有节点或关系添加或删除属性,SET 子句中新的属性添加到现有节点或关系。
remove 子句来删除节点或关系的现有属性。

REMOVE命令用于

  • 要删除一个节点或关系标签
  • 要删除一个节点或关系的性质

delete 和 remove命令之间的相似性

  • 两个命令都不能单独使用。
  • 这两个命令都应该match命令使用。

删除节点/关系属性
我们可以使用相同的语法来删除一个节点或从数据库中永久关系的性质的属性或列表。

删除属性子句语法
REMOVE

S.No. 语法元素 描述
1。 去掉 这是一个Neo4j的CQL关键字。
2。 <属性名称列表> 它是属性的列表,以从节点或永久性的关系将其删除。

属性名称列表 《语法》

.,

.,
….

.

语法说明

S.No. 语法元素 描述
1。 <节点名称> 它是一个节点的名称。
2。 <属性名称> 它是一个节点的属性名。

我们应用逗号(,)云算法分隔标签名称列表。

我们应用(.) 运算符分割节点名称和标签名称。

创建一个节点,并从该节点从数据库中永久删除属性。

1
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250})

也可以这么写

1
2
3
4
5
6
7
CREATE TABLE BOOK(
id number,
title varchar2(20),
pages number,
price number
);
INSERT INTO BOOK VALUES (122,'Neo4j Tutorial',340,251);

删除 price属性

1
2
3
MATCH (book { id:122 })
REMOVE book.price
RETURN book

set语法

提供SET子句来执行下列操作。

  • 新属性添加到现有的节点或关系
  • 添加或更新属性值

SET子句语法
SET

S.No. 语法元素 描述
1。 这是一个Neo4j的CQL关键字。
2。 <属性名称列表> 这是属性执行添加或更新操作满足我们的要求清单。

<属性名称列表>语法:

.,

.,
….

.
语法说明

S.No. 语法元素 描述
1。 <节点标签名称> 这是一个节点的标签名称。
2。 <属性名称> 它是一个节点的属性名。

何将一个新的属性添加到现有的借记卡节点。

1
CREATE (dc:DebitCard{I'd:11,name:'ABC11XYZ',valid_from : 0211,vaild_to:0221})

查找这个节点

1
2
MATCH (dc:DebitCard)
RETURN dc

“借记卡”节点都有4个属性。 现在,我们要添加新属性“atm_pin”这个节点。

1
2
3
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc

排序

默认情况下,按升序订单行。 如果我们要在他们降序排序,我们需要用DESC。

ORDER BY子句语法
ORDER BY [DESC]
|S.No.| 语法元素| 描述|
|1。| ORDER BY| 这是一个Neo4j的CQL关键字。|
|2。| <属性名称列表> |它是在分拣使用的属性的列表。|
|3。| DESC |它是用于指定降序order.It是可选的一个Neo4j的CQL关键字。|

<属性名称列表>语法:

.,

.,
….

.
语法说明

|S.No.| 语法元素| 描述|
|1。| <节点标签名称>| 这是一个节点的标签名称。|
|2。| <属性名称> |它是一个节点的属性名。|

通过员工姓名使用排序结果升序排列。

1
2
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno

观察数据

1
2
3
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name

排序观察

1
2
3
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC

LIMIT and SKIP

它修剪从CQL查询结果集底部的结果。

如果我们要修剪掉CQL查询结果集顶部的结果,那么我们就应该去CQL SKIP子句。

LIMIT子句语法
LIMIT
语法说明

S.No. 语法元素 描述
1。 limit 这是一个Neo4j的CQL关键字。
2。 number 它是一个跨值。
1
2
MATCH (emp:Employee) 
RETURN emp

我们仅取两条数据

1
2
3
MATCH (emp:Employee) 
RETURN emp
LIMIT 2

SKIP子句语法:
SKIP
语法说明

S.No. 语法元素 描述
1。 skip 这是一个Neo4j的CQL关键字。
2。 number 它是一个跨值。
1
2
3
MATCH (emp:Employee) 
RETURN emp
SKIP 2

MERGE

MERGE 使用命令

  1. 要创建节点,关系和属性
  2. 为了从数据库中检索数据
    MERGE 命令是CREATE 命令和MATH命令的组合。
    MERGE = CREATE + MATCH
    MERGE 图中给定模式命令搜,如果存在则返回结果
    如果他不在图中,则创建新的节点/关系并返回结果。

MERGE语法
MERGE (:
{
:<Pro
…..
:
})

语法说明

S.No. 语法元素 描述
1。 MERGE 这是一个Neo4j的CQL关键字。
2。 Property1-name 它是一个节点或关系的名称。
3。 label-name 这是一个节点或关系的标签名称。
4。 <PROPERTY_NAME> 这是一个节点或关系的属性名。
5。 <PROPERTY_VALUE> 这是一个节点或关系的属性值。
6。 使用冒号(:)操作符来分隔属性名称和一个节点或关系的价值。

CREATE执行上述所有操作,MATCH和RETURN命令来创建Google+个人资料。

1
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})

先创建一个数据点

1
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})

再创建一个数据点

1
2
MATCH  (gp1:GoogleProfile1) 
RETURN gp1.Id,gp1.Name

获取所有个人资料节点详细信息和观察结果。

从结果来看,它显示2行有重复的值。

CQL CREATE命令不检查是否该节点可用与否,它只是在数据库中创建新的节点。

通过观察这些结果,我们可以说,CREATE命令总是将新节点添加到数据库。

现在我们用MERGE执行同一套以上操作,并返回命令创建Google+个人资料。

1
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})

第一次创建

1
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})

再次创建

1
2
MATCH  (gp1:GoogleProfile1) 
RETURN gp1.Id,gp1.Name

获取所有个人资料节点详细信息和观察结果

定向关系

在 Neo4j中,两个节点之间的关系是有方向的。他们要么是单向要么是双向。
由于 Neo4j的如下属性图的数据模型,他应该只支持方向的关系。如果我们试图简历一个没有任何方向的关系,那么Neo4j的DB服务器应该会抛出一个错误。
在本节中,我们将提供一个例子来证明这一点。

CREATE ()-[]->()

如果我们观察上面的语法,它用一个箭头标志:() - []→()。 它表示从左侧节点到右侧节点的方向。

如果我们试图用同样的语法,而不箭头状() - [] - (),这意味着没有方向的关系。 然后,Neo4j的DB服务器应该抛出一个错误信息

证明一切Neo4j的关系是有方向的。