neo4j基础入门教程

明月楼高休独倚,酒入愁肠,化作相思泪

Posted by yishuifengxiao on 2021-11-03

一 neo4j入门简介

CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

1.1 Neo4j CQL命令

CQL命令/条 用法
CREATE 创建 创建节点,关系和属性
MATCH 匹配 检索有关节点,关系和属性数据
RETURN 返回 返回查询结果
WHERE 哪里 提供条件过滤检索数据
DELETE 删除 删除节点和关系
REMOVE 移除 删除节点和关系的属性
ORDER BY以…排序 排序检索数据
SET 组 添加或更新标签

1.2 Neo4j CQL 函数

定制列表功能 用法
String 字符串 它们用于使用String字面量。
Aggregation 聚合 它们用于对CQL查询结果执行一些聚合操作。
Relationship 关系 他们用于获取关系的细节,如startnode,endnode等。

1.3 Neo4j CQL数据类型

CQL数据类型 用法
boolean 用于表示布尔文字:true,false。
byte 用于表示8位整数。
short 用于表示16位整数。
int 用于表示32位整数。
long 用于表示64位整数。
float I用于表示32位浮点数。
double 用于表示64位浮点数。
char 用于表示16位字符。
String 用于表示字符串。

二 neo4j基础命令

2.1 CREATE命令

CREATE命令的主要作用如下:

  • 创建没有属性的节点
  • 使用属性创建节点
  • 在没有属性的节点之间创建关系
  • 使用属性创建节点之间的关系
  • 为节点或关系创建单个或多个标签

2.1.1 创建没有属性的节点

创建一个没有任何数据的节点

CREATE命令语法

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

语法说明

语法元素 描述
CREATE 它是一个Neo4j CQL命令。
<node-name> 它是要创建的节点名称。
<label-name> 它是一个节点标签名称

注意事项 :

1、Neo4j数据库服务器使用此将此节点详细信息存储在Database.As中作为Neo4j DBA或Developer,不能使用它来访问节点详细信息。

2、Neo4j数据库服务器创建一个作为内部节点名称的别名。作为Neo4j DBA或Developer,应该使用此标签名称来访问节点详细信息。

使用示例

命令如下:

CREATE (emp:Employee)

这里 emp 是一个节点名,Employee 是 emp 节点的标签名称

image-20211102113831104

{
"identity": 0,
"labels": [
"Employee"
],
"properties": {

}
}

2.1.2 创建具有属性的节点

创建一个具有一些属性(键值对)的节点来存储数据

CREATE命令语法

CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)

语法说明

语法元素 描述
<node-name> 它是将要创建的节点名称。
<label-name> 它是一个节点标签名称
<Property1-name>...<Propertyn-name> 属性是键值对。 定义将分配给创建节点的属性的名称
<Property1-value>...<Propertyn-value> 属性是键值对。 定义将分配给创建节点的属性的值

使用示例1

创建具有一些属性(deptno,dname,位置)的Dept节点

命令如下

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

这里dept是一个节点名,Dept是dept节点的标签名称。这里的属性名称是deptno,dname,location属性值为10,”Accounting”,”Hyderabad” ,Property = deptno:10

因为deptno是一个整数属性,所以没有使用单引号或双引号定义其值10。

由于dname和location是String类型属性,因此使用单引号或双引号定义其值。

注意 - 要定义字符串类型属性值,需要使用单引号或双引号。

结果如下:

image-20211102131800251

{
"identity": 1,
"labels": [
"Dept"
],
"properties": {
"location": "Hyderabad",
"dname": "Accounting",
"deptno": 10
}
}

使用示例2

创建具有一些属性(id,name,sal,deptno)的Employee节点

命令如下

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

这里emp是一个节点名。Employee是emp节点的标签名称

结果如下(包含2.1.1中创建的节点)

image-20211102132656968

{
"identity": 2,
"labels": [
"Employee"
],
"properties": {
"name": "Lokesh",
"id": 123,
"deptno": 10,
"sal": 35000
}
}

2.2 MATCH命令

MATCH 命令用于

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

MATCH 命令语法:

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

语法说明

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

注意事项

  • Neo4j 数据库服务器使用此 将此节点详细信息存储在 Database.As 中作为 Neo4j DBA 或 Developer,不能使用它来访问节点详细信息。
  • Neo4j 数据库服务器创建一个 作为内部节点名称的别名。作为 Neo4j DBA 或 Developer,应该使用此标签名称来访问节点详细信息。

注意-不能单独使用 MATCH Command 从数据库检索数据。 如果单独使用它,那么将 InvalidSyntax 错误。

例如执行:

MATCH (dept:Dept)

image-20211102133108422

MATCH 经常需要与其他的语句配合才可以使用.

如:match (n) return n

# 查询Dept下的内容
MATCH (dept:Dept) return dept

# 查询Employee标签下 id=123,name="Lokesh"的节点
MATCH (p:Employee {id:123,name:"Lokesh"}) RETURN p

## 查询Employee标签下name="Lokesh"的节点,使用(where命令)
MATCH (p:Employee)
WHERE p.name = "Lokesh"
RETURN p

2.3 RETURN子句

RETURN子句用于

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

RETURN命令语法:

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

语法说明:

语法元素 描述
<node-name> 它是将要创建的节点名称。
<Property1-name>...<Propertyn-name> 属性是键值对。 定义要分配给创建节点的属性的名称

*注意-不能单独使用 RETURN Command 从数据库检索数据。 如果单独使用它,那么将 SyntaxError 错误。*

例如执行

RETURN dept.deptno

image-20211102134106725

2.4 MATCH & RETURN匹配和返回

在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该合并这两个命令以从数据库检索数据。

Neo4j使用CQL MATCH + RETURN命令 -

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

2.4.1 命令语法

MATCH RETURN命令语法

MATCH Command
RETURN Command

语法说明:

语法元素 描述
MATCH命令 这是Neo4j CQL MATCH命令。
RETURN命令 这是Neo4j CQL RETURN命令。


MATCH命令语法:

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

语法说明:

语法元素 描述
<node-name> 它是将要创建的节点名称。
<label-name> 它是一个节点标签名称


RETURN命令语法:

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

语法说明:

语法元素 描述
<node-name> 它是将要创建的节点名称。
<Property1-name>...<Propertyn-name> 属性是键值对。 定义将分配给创建节点的属性的名称

2.4.2 使用示例1

本示例演示如何从数据库检索Dept节点的一些属性(deptno,dname)数据。

注-结点包含3个属性:deptno,dname,location。 然而在这个例子中,感兴趣的是只查看两个属性数据。

命令如下:

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

这里 -

  • dept是节点名称
  • 这里Dept是一个节点标签名
  • deptno是dept节点的属性名称
  • dname是dept节点的属性名

运行结果如下:

image-20211102134906165


2.4.3 使用示例2

此示例演示如何从数据库检索Dept节点的数据,而无需指定其属性。

注-结点包含3个属性:deptno,dname,location。

命令如下:

MATCH (e:Employee)
RETURN e

这里e是一个节点名,Employee是一个节点标签名

运行结果如下:

image-20211102135318343

2.5 关系类型

在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该结合这两个命令从数据库检索数据。

本示例演示如何使用属性和这两个节点之间的关系创建两个节点。

注-将创建两个节点:客户节点 (Customer) 和信用卡节点 (CreditCard)。

  • 客户节点包含:ID,姓名,出生日期属性
  • CreditCard节点包含:id,number,cvv,expiredate属性
  • 客户与信用卡关系:DO_SHOPPING_WITH
  • CreditCard到客户关系:ASSOCIATED_WITH

将在以下步骤中处理此示例: -

  • 创建客户节点
  • 创建CreditCard节点
  • 观察先前创建的两个节点:Customer和CreditCard
  • 创建客户和CreditCard节点之间的关系
  • 查看新创建的关系详细信息
  • 详细查看每个节点和关系属性

创建客户节点

命令如下:

CREATE (e:Customer{id:"1001",name:"Abc",dob:"01/10/1982"})

参数解释如下:

  • e是节点名称
  • 在这里Customer是节点标签名称
  • id,name和dob是Customer节点的属性名称

创建CreditCard节点

命令如下:

CREATE (cc:CreditCard{id:"5001",number:"1234567890",cvv:"888",expiredate:"20/17"})

这里cc是一个节点名,CreditCard是节点标签名称; id,number,cvv和expiredate是CreditCard节点的属性名称

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

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

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

  • 单向关系
  • 双向关系

在以下场景中,可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。

  • 在两个现有节点之间创建无属性的关系
  • 在两个现有节点之间创建有属性的关系
  • 在两个新节点之间创建无属性的关系
  • 在两个新节点之间创建有属性的关系
  • 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系

注意 -

将创建客户和CreditCard之间的关系,如下所示:

创建客户和CreditCard之间的关系

此图描述了客户与CreditCard之间的关系

客户→信用卡 ,这里的关系是箭头标记(→)。由于Neo4j CQL语法是以人类可读的格式。 Neo4j CQL也使用类似的箭头标记来创建两个节点之间的关系。

每个关系(→)包含两个节点

  • 从节点
  • 到节点

从上图中,Customer节点是“From Node”,CreditCard Node是“To Node”这种关系。

对于节点,它们是两种关系

  • 外向关系
  • 传入关系

从上图中,关系是到客户节点的“外向关系”,并且相同的关系是到信用卡节点的“到达关系”。

考虑下面的图。 这里创建了从“CreditCard”节点到“客户”节点的关系。

从“CreditCard”节点到“客户”节点的关系

从上面的图中,关系是“出局关系”到“信用卡”节点,并且相同的关系是“到达关系”到“客户”节点。

考虑下面的图。 在“CreditCard”和“Customer”节点之间创建了两个关系:一个从“CreditCard”到“Customer”。 另一个从“客户”到“信用卡”。 这意味着它是双向关系。

双向关系

2.5.1 使用现有节点创建没有属性的关系

在这种情况下,将使用两个现有节点:CreditCard和Customer创建没有属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。

使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。

语法:

MATCH (<node1-label-name>:<nodel-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<define-properties-list>}]->(<node2-label-name>)
RETURN <relationship-label-name>

语法说明:

语法元素 描述
MATCH,CREATE,RETURN 他们是Neo4J CQL关键字。
<node1-name> 它用于创建关系的“From Node”的名称。
<node1-label-name> 它用于创建关系的“From Node”的标签名称。
<node2-name> 它用于创建关系的“To Node”的名称。
<node2-label-name> 它用于创建关系的“To Node”的标签名称。
<relationship-name> 这是一个关系的名称。
<relationship-label-name> 它是一个关系的标签名称。

注意:

在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。


使用示例

MATCH (e:Customer),(cc:CreditCard) 
CREATE (e)-[r:DO_SHOPPING_WITH ]->(cc)

这里关系名称为“DO_SHOPPING_WITH” , 关系标签为“r”。e和Customer分别是客户节点的节点名称和节点标签名称。cc和CreditCard分别是CreditCard节点的节点名和节点标签名。

执行成功后,再执行以下命令

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

结果如下:

{
"identity": 2,
"start": 6,
"end": 7,
"type": "DO_SHOPPING_WITH",
"properties": {

}
}

查看数据,可以看到:

image-20211102160001967

2.5.2 使用现有节点创建有属性的关系

在这种情况下,将使用两个现有节点:CreditCard和Customer创建与属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。

使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。

语法:

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<define-properties-list>}]->(<node2-label-name>)
RETURN <relationship-label-name>

语法说明:

语法元素 描述
MATCH,CREATE,RETURN 他们是Neo4J CQL关键词。
<node1-name> 它是用于创建关系的“From Node”的名称。
<node1-label-name> 它是用于创建关系的“From Node”的标签名称。
<node2-name> 它是用于创建关系的“To Node”的名称。
<node2-label-name> 它是用于创建关系的“To Node”的标签名称。
<relationship-name> 这是一个关系的名称。
<relationship-label-name> 它是一个关系的标签名称。
<define-properties-list> 它是分配给新创建关系的属性(名称 - 值对)的列表。

注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。

可以表示这{}如下。

语法 -

{ 
<property1-name>:<property1-value>,
<property2-name>:<property2-value>,
...
<propertyn-name>:<propertyn-value>
}

语法说明:

语法元素 描述
<propertyx-name> 它是分配给新创建关系的属性的名称。 其中x是1,2,… n个值
<propertyx-value> 这是一个分配给新创建关系的Property的值。 其中x是1,2,… n个值

应该使用Colon(:)运算符来分隔属性名称和值。应该使用Comma(,)运算符将一对Property(名称值)与另一对Property分离。


使用示例

验证客户和CreditCard节点可用

MATCH (e:Customer) 
RETURN e
MATCH (cc:CreditCard) 
RETURN cc

输入以下命令

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

参数解释如下:

  • 关系名称为“DO_SHOPPING_WITH”
  • 关系标签为“r”。
  • shopdate和price是关系“r”的属性。
  • cust和Customer分别是客户节点的节点名称和节点标签名称。
  • cc和CreditCard分别是CreditCard节点的节点名和节点标签名。

由于使用RETURN子句,不需要单独的MATCH + RETRUN命令来查看详细信息。 它在UI模式下显示它们之间的节点和关系

image-20211102164954027

2.5.3 使用新节点创建没有属性的关系

在这种情况下,将一次创建两个没有属性的节点和关系。 这意味着,的Neo4J数据库没有这两个节点。

使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。

语法:

CREATE  
(<node1-label-name>:<node1-name>)-
[<relationship-label-name>:<relationship-name>]->
(<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>

语法说明:

语法元素 描述
CREATE,RETURN 他们是Neo4J CQL关键字。
<node1-name> 它用于创建关系的“From Node”的名称。
<node1-label-name> 它用于创建关系的“From Node”的标签名称。
<node2-name> 它用于创建关系的“To Node”的名称。
<node2-label-name> 它用于创建关系的“To Node”的标签名称。
<relationship-name> 这是一个关系的名称。
<relationship-label-name> 它是一个关系的标签名称。

注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。


使用示例

命令如下

CREATE (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2)

参数解释如下:

  • 这里关系名称是“LIKES”
  • 关系标签是“like”。
  • fb1和FaceBookProfile1分别是“From Node”的节点名和节点标签名。
  • fb2和FaceBookProfile2分别是“To Node”的节点名和节点标签名。

执行结果如下:

image-20211102165815023

查看创建的数据

MATCH (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2) 
RETURN like

结果如下:

{
"identity": 5,
"start": 10,
"end": 11,
"type": "LIKES",
"properties": {

}
}

2.5.4 使用新节点创建有属性的关系

在这种情况下,将一次创建两个节点和关系属性。 这意味着,的Neo4J数据库没有这两个节点。

使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。

语法:

CREATE  
(<node1-label-name>:<node1-name>{<define-properties-list>})-
[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
->(<node1-label-name>:<node1-name>{<define-properties-list>})
RETURN <relationship-label-name>

语法说明:

语法元素 描述
CREATE,RETURN 他们是Neo4J CQL关键字。
<node1-name> 它用于创建关系的“From Node”的名称。
<node1-label-name> 它用于创建关系的“From Node”的标签名称。
<node2-name> 它用于创建关系的“To Node”的名称。
<node2-label-name> 它用于创建关系的“To Node”的标签名称。
<relationship-name> 这是一个关系的名称。
<relationship-label-name> 它是一个关系的标签名称。

注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。

可以表示这个{}如下。

语法

{ 
<property1-name>:<property1-value>,
<property2-name>:<property2-value>,
...
<propertyn-name>:<propertyn-value>
}

示例

命令如下

CREATE (video1:YoutubeVideo1{title:"Action Movie1",updated_by:"Abc",uploaded_date:"10/10/2010"})
-[movie:ACTION_MOVIES{rating:1}]->
(video2:YoutubeVideo2{title:"Action Movie2",updated_by:"Xyz",uploaded_date:"12/12/2012"})

参数解释如下:

  • 这里的关系名称是“ACTION_MOVIES”
  • 关系标签是“电影”。
  • video1和YoutubeVideo1分别是“From Node”的节点名和节点标签名。
  • video2和YoutubeVideo2分别是“To Node”的节点名和节点标签名。

待上述命令执行成功,可通过一下命令查看结果

MATCH (video1:YoutubeVideo1)-[movie:ACTION_MOVIES]->(video2:YoutubeVideo2) 
RETURN movie

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

可以使用MATCH + RETURN命令来查看单独创建或作为关系的一部分创建的节点的详细信息。

在本章中,将讨论如何检索参与关系的Node的详细信息。

语法:

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

语法说明:

语法元素 描述
MATCH,RETURN 他们是Neo4j CQL关键字。
<node1-label-name> 它是用于创建关系的“From Node”的标签名称。
<node2-label-name> 它是用于创建关系的“To Node”的标签名称。
<relationship-name> 它是一个关系的名称。
<relationship-label-name> 它是关系的标签名称。

示例

此示例演示如何检索用于创建关系的“表单节点”和“到节点”节点的详细信息。

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

2.6 CREATE创建标签

Label是Neo4j数据库中的节点或关系的名称或标识符。可以将此标签名称称为关系为“关系类型”。

可以使用CQL CREATE命令为节点或关系创建单个标签,并为节点创建多个标签。 这意味着Neo4j仅支持两个节点之间的单个关系类型。可以在UI模式和网格模式下在CQL数据浏览器中观察此节点或关系的标签名称。 并且引用它执行CQL命令。到目前为止,只创建了一个节点或关系的标签,但没有讨论它的语法。

使用Neo4j CQL CREATE命令

  • 为节点创建单个标签
  • 为节点创建多个标签
  • 为关系创建单个标签

2.6.1 单个标签到节点

语法:

CREATE (<node-name>:<label-name>)
语法元素 描述
CREATE 创建 它是一个Neo4j CQL关键字。
<node-name> <节点名称> 它是一个节点的名称。
<label-name><标签名称> 这是一个节点的标签名称。

注意 -

  • 应该使用colon(:)运算符来分隔节点名和标签名。
  • Neo4j数据库服务器使用此名称将此节点详细信息存储在Database.As Neo4j DBA或Developer中,不能使用它来访问节点详细信息
  • Neo4j数据库服务器创建一个标签名称作为内部节点名称的别名。作为Neo4j DBA或开发人员,应该使用此标签名称来访问节点详细信息。

使用示例

本示例演示如何为“GooglePlusProfile”节点创建单个标签。

CREATE (google1:GooglePlusProfile)

这里的google1是一个节点名,GooglePlusProfile是google1node的标签名称

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

2.6.2 多个标签到节点

语法:

CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
语法元素 描述
CREATE 创建 这是一个Neo4j CQL关键字。
<node-name> <节点名称> 它是一个节点的名称。
<label-name1>,<label-name2> <标签名1>,<标签名2> 它是一个节点的标签名称的列表。

注意 -

  • 应该使用colon(:)运算符来分隔节点名和标签名。
  • 应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。

使用示例

本示例演示如何为“Cinema”节点创建多个标签名称。的客户提供的多个标签名称:Cinema,Film,Movie,Picture。

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

这里m是一个节点名,Movie, Cinema, Film, Picture是m节点的多个标签名称

2.6.3 单个标签到关系

语法:

CREATE (<node1-name>:<label1-name>)-
[(<relationship-name>:<relationship-label-name>)]
->(<node2-name>:<label2-name>)

语法说明

语法元素 描述
CREATE 创建 它是一个Neo4J CQL关键字。
<node1-name> <节点1名> 它是From节点的名称。
<node2-name> <节点2名> 它是To节点的名称。
<label1-name> <LABEL1名称> 它是From节点的标签名称
<label2-name> <LABEL2名称> 它是To节点的标签名称。
<relationship-name> <关系名称> 它是一个关系的名称。
<relationship-label-name> <相关标签名称> 它是一个关系的标签名称。

注意 -

  • 应该使用colon(:)运算符来分隔节点名和标签名。
  • 应该使用colon(:)运算符来分隔关系名称和关系标签名称。
  • 应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。
  • Neo4J数据库服务器使用此名称将此节点详细信息存储在Database.As中作为Neo4J DBA或开发人员,不能使用它来访问节点详细信息。
  • Neo4J Database Server创建一个标签名称作为内部节点名称的别名。作为Neo4J DBA或Developer,应该使用此标签名称来访问节点详细信息。

使用示例

本示例演示如何为关系创建标签

CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)

参数解释如下:

  • 这里p1和profile1是节点名称和节点标签名称“From Node”
  • p2和Profile2是“To Node”的节点名称和节点标签名称
  • r1是关系名称
  • LIKES是一个关系标签名称

2.7 WHERE子句

2.7.1 语法说明

像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。

简单WHERE子句语法

WHERE <condition>

复杂WHERE子句语法

WHERE <condition> <boolean-operator> <condition>

可以使用布尔运算符在同一命令上放置多个条件。

语法:

<property-name> <comparison-operator> <value>

语法说明:

语法元素 描述
WHERE 它是一个Neo4j CQL关键字。
<property-name> <属性名称> 它是节点或关系的属性名称。
<comparison-operator> <比较运算符> 它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。
<value> <值> 它是一个字面值,如数字文字,字符串文字等。

Neo4j CQL中的布尔运算符

Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。

布尔运算符 描述
AND 它是一个支持AND操作的Neo4j CQL关键字。
OR 它是一个Neo4j CQL关键字来支持OR操作。
NOT 它是一个Neo4j CQL关键字支持NOT操作。
XOR 它是一个支持XOR操作的Neo4j CQL关键字。

Neo4j CQL中的比较运算符

Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。

布尔运算符 描述
= 它是Neo4j CQL“等于”运算符。
<> 它是一个Neo4j CQL“不等于”运算符。
< 它是一个Neo4j CQL“小于”运算符。
> 它是一个Neo4j CQL“大于”运算符。
<= 它是一个Neo4j CQL“小于或等于”运算符。
>= 它是一个Neo4j CQL“大于或等于”运算符。

2.7.2 使用示例

此示例演示如何在MATCH Command中的CQL WHERE子句中使用多个条件与布尔运算符,以根据员工名称检索员工详细信息。

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

观察结果,它返回4个员工节点详细信息.

MATCH (emp:Employee) 
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp

观察到结果,它只返回两个名为“Abc”或“Xyz”的员工详细信息。

2.7.3 用WHERE子句创建关系

在Neo4J CQL中,可以以不同的方式创建拖曳节点之间的关系。

  • 创建两个现有节点之间的关系
  • 一次创建两个节点和它们之间的关系
  • 使用WHERE子句创建两个现有节点之间的关系

语法

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)

语法说明:

语法元素 描述
MATCH,WHERE,CREATE 他们是Neo4J CQL关键字。
<node1-label-name> 它是一个用于创建关系的节点一标签名称。
<node1-name> 它是一个用于创建关系的节点名称。
<node2-label-name> 它是一个用于创建关系的节点一标签名称。
<node2-name> 它是一个用于创建关系的节点名称。
<condition> 它是一个Neo4J CQL WHERE子句条件。 它可以是简单的或复杂的。
<relationship-label-name> 这是新创建的节点一和节点二之间的关系的标签名称。
<relationship-name> 这是新创建的节点1和节点2之间的关系的名称。
<relationship-properties> 这是一个新创建节点一和节点二之间关系的属性列表(键 - 值对)。

使用示例

MATCH (cust:Customer),(cc:CreditCard) 
WHERE cust.id = "1001" AND cc.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r

2.8 DELETE删除

Neo4j使用CQL DELETE子句

  • 删除节点。
  • 删除节点及相关节点和关系。

2.8.1 删除节点

通过使用此命令,可以从数据库永久删除节点及其关联的属性。

DELETE节点子句语法

DELETE <node-name-list>
语法元素 描述
DELETE 它是一个Neo4j CQL关键字。
<node-name-list> 它是一个要从数据库中删除的节点名称列表。

注意 -

应该使用逗号(,)运算符来分隔节点名。

使用示例

此示例演示如何从数据库中永久删除节点。

首先查询数据

MATCH (e: Employee) RETURN e

注意 -

MATCH (e: 'Employee') RETURN e

MATCH (e: "Employee") RETURN e

MATCH (e: Employee) RETURN e

所有三个命令都相同,可以选择这些命令中的任何一个。

接下来执行

MATCH (e: Employee) DELETE e

现在,而不是“返回e”,使用“DELETE e”命令删除Employee节点

再执行查询语句

MATCH (e: Employee) RETURN e

可以发现,数据已被删除。

2.8.2 DELETE节点和关系子句

语法

DELETE <node1-name>,<node2-name>,<relationship-name>
语法元素 描述
DELETE 它是一个Neo4j CQL关键字。
<node1-name> 它是用于创建关系的一个结束节点名称。
<node2-name> 它是用于创建关系的另一个节点名称。
<relationship-name> 它是一个关系名称,它在之间创建。

注意 -

应该使用逗号(,)运算符来分隔节点名称和关系名称。

使用示例

此示例演示如何从数据库永久删除节点及其关联节点和关系。

首先查询关系

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

在这里观察到一个节点为客户,一个节点为信用卡和它们之间的关系是可用的。

接下来执行删除语句

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

这里可以观察到两个节点及其关联的10个关系被成功删除。

2.8.3 清空所有数据

两种方法:

一、用下列 Cypher 语句:

match (n) detach delete n

二、

1、停掉服务;

2、删除 graph.db 目录;

3、重启服务。

2.9 REMOVE删除

有时需要向现有节点或关系添加或删除属性 , 使用Neo4j CQL SET子句向现有节点或关系添加新属性,使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。

REMOVE命令用于

  • 删除节点或关系的标签
  • 删除节点或关系的属性

    DELETE和 REMOVE 命令之间的主要区别 -

  • DELETE操作用于删除节点和关联关系。

  • REMOVE操作用于删除标签和属性。

    DELETE和REMOVE命令之间的相似性 -

  • 这两个命令不应单独使用。

  • 两个命令都应该与MATCH命令一起使用。

2.9.1 删除节点/关系的属性

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

REMOVE属性子句语法

REMOVE <property-name-list>
语法元素 描述
REMOVE 它是一个Neo4j CQL关键字。
<property-name-list> 它是一个属性列表,用于永久性地从节点或关系中删除它。

<属性名称列表>语法

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

语法说明:

语法元素 描述
它是节点的名称。
它是节点的属性名称。

注意 -

  • 应该使用逗号(,)运算符来分隔标签名称列表。
  • 应该使用dot(。)运算符来分隔节点名称和标签名称。

使用示例

先创建数据

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

然后查询数据

MATCH (book : Book)
RETURN book

image-20211102191004720

解下来执行删除语句(从书节点中删除“price”属性)

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

再次查询数据,可以看到此属性已被删除

image-20211102191247376

2.9.2 删除节点/关系的标签

可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表。

REMOVE一个Label子句语法:

REMOVE <label-name-list>
语法元素 描述
REMOVE 它是一个Neo4j CQL关键字。
<label-name-list> 它是一个标签列表,用于永久性地从节点或关系中删除它

语法

<node-name>:<label2-name>, 
....
<node-name>:<labeln-name>

语法说明:

语法元素 描述
<node-name> <节点名称> 它是一个节点的名称。
<label-name> <标签名称> 这是一个节点的标签名称。

注意 -

  • 应该使用逗号(,)运算符来分隔标签名称列表。
  • 应该使用colon(:)运算符来分隔节点名和标签名。

使用示例

此示例演示如何从数据库永久删除不需要的标签到节点。

MATCH (m:Movie) 
REMOVE m:Picture

2.10 SET子句

有时需要向现有节点或关系添加新属性,要做到这一点,Neo4j CQL 提供了一个SET子句。

Neo4j CQL 已提供 SET 子句来执行以下操作。

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

SET子句语法

SET  <property-name-list>
语法元素 描述
SET 它是一个 Neo4j 的 CQL 关键字。
<property-name-list> 它是一个属性列表,用于执行添加或更新操作以满足的要求。

<属性名称列表>语法:

<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>

语法说明:

语法元素 描述
<node-label-name> <节点标签名称> 这是一个节点的标签名称。
<property-name> <属性名称> 它是一个节点的属性名。

注意 -

应该使用逗号(,)运算符来分隔属性名列表。


使用示例

先查询数据

MATCH (book:Book)
RETURN book

得到如下结果:

image-20211102192441884

再执行set语句

MATCH (book:Book)
SET book.title = 'superstar'
RETURN book

image-20211102192554803

2.11 ORDER BY排序

Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。

可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果要按降序对它们进行排序,需要使用DESC子句。

ORDER BY子句语法

ORDER BY  <property-name-list>  [DESC]

<property-name-list>语法:

<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>

语法说明:

语法元素 描述
<node-label-name> 它是节点的标签名称。
<property-name> 它是节点的属性名称。

注意 -

应该使用逗号(,)运算符来分隔属性名列表。

使用示例

此示例演示如何按照升序排序“员工名称”结果。

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

此示例演示如何按照员工名称按降序使用排序结果

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

2.12 UNION合并

与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果

  • UNION
  • UNION ALL

2.12.1 UNION子句

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

限制:

结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

UNION子句语法

<MATCH Command1>
UNION
<MATCH Command2>

语法说明:

语法元素 描述
<MATCH COMMAND1> 它是CQL MATCH命令,由UNION子句使用。
<MATCH Command2> 它是CQL MATCH命令两个由UNION子句使用。
UNION 它是UNION子句的Neo4j CQL关键字。

注意 -

如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。

2.12.2 UNION ALL子句

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制

结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

UNION ALL子句语法

<MATCH Command1>
UNION ALL
<MATCH Command2>

语法说明

语法元素 描述
<MATCH COMMAND1> 这是CQL match命令由UNION子句中使用的一个。
<MATCH命令2> 这是CQL match命令两到由UNION子句中使用。
UNION ALL 这是UNION ALL子句的Neo4j的CQL关键字。

注意 -

如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。

2.13 LIMIT和SKIP子句

2.13.1 LIMIT子句

Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。如果要修整CQL查询结果集顶部的结果,那么应该使用CQL SKIP子句。 请参考本章的下一节CQL SKIP子句。

LIMIT子句语法

LIMIT <number>

语法说明:

语法元素 描述
LIMIT 它是一个Neo4j CQL关键字。
<number> 它是一个跨值。

使用示例

MATCH (n:Book) RETURN n LIMIT 25

得到的结果如下:

image-20211103091747786

2.13.2 SKIP子句

Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。如果要从CQL查询结果集底部修整结果,那么应该使用CQL LIMIT子句。

SKIP子句语法:

SKIP <number>

语法说明:

语法元素 描述
SKIP 它是一个Neo4j CQL关键字。
<number> 它是一个间隔值。

使用示例

MATCH (emp:Employee) 
RETURN emp
SKIP 2

2.14 IN操作符

与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。

IN操作符语法

IN[<Collection-of-values>]

语法说明:

语法元素 描述
IN 它是一个Neo4j CQL关键字。
[ 它告诉Neo4j CQL,一个值的集合的开始。
] 它告诉Neo4j CQL,值集合的结束。
<Collection-of-values> 它是由逗号运算符分隔的值的集合。

使用示例

MATCH (e:Employee) 
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno

2.15 ID属性

在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。

以相同的方式,Neo4j数据库服务器为关系分配一个默认Id属性。

  • 节点的Id属性的最大值约为35亿。
  • Id的最大值关系的属性的大约35亿。

二 CQL函数

2.1 AGGREGATION聚合

和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY子句。

可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。

聚合函数列表

聚集功能 描述
COUNT 它返回由MATCH命令返回的行数。
MAX 它从MATCH命令返回的一组行返回最大值。
MIN 它返回由MATCH命令返回的一组行的最小值。
SUM 它返回由MATCH命令返回的所有行的求和值。
AVG 它返回由MATCH命令返回的所有行的平均值。

2.1.1 计数

它从MATCH子句获取结果,并计算结果中出现的行数,并返回该计数值。 所有CQL函数应使用“()”括号。

函数语法

COUNT(<value>)

注意 -

<value>可以是*,节点或关系标签名称或属性名称。

示例

先输入查询语句

MATCH (n:Book) RETURN n LIMIT 25

得到的结果如下:

image-20211103133810636

然后执行计数语句

MATCH (n:Book) RETURN count(*)

得到的结果如下:

image-20211103133914066

2.1.2 max和min函数

MAX

它采用一组行和节点或关系的<property-name>作为输入,并从给定行的 <property-name>列中查找最大值。

函数语法

MAX(<property-name> )

MIN

它采用一组行和节点或关系的<property-name>作为输入,并从给定行的<property-name>列中查找最小值。

函数语法

MIN(<property-name> )

注意 -

<property-name>应该是节点或关系的名称。

使用示例

MATCH (n:Book) RETURN max(n.born),min(n.born)

image-20211103134455857

2.1.3 AVG和SUM函数

AVG

它采用一组行和节点或关系的<property-name>作为输入,并从给定行的give <property-name>列中查找平均值。

函数的语法

AVG(<property-name> )

SUM

它采用一组行和节点或关系的<property-name>作为输入,并从给定行的give <property-name>列中查找求和值。

函数的语法

SUM(<property-name> )

使用示例

MATCH (n:Book) RETURN avg(n.born),sum(n.born)

image-20211103134840899

2.2 关系函数

Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。

关系函数列表

功能 描述
STARTNODE 它用于知道关系的开始节点。
ENDNODE 它用于知道关系的结束节点。
ID 它用于知道关系的ID。
TYPE 它用于知道字符串表示中的一个关系的TYPE。

2.2.1 STARTNODE和ENDNODE

它需要一个字符串作为输入并为大写格式, 所有CQL函数应使用“()”括号。

函数语法

STARTNODE (<relationship-label-name>)
ENDNODE (<relationship-label-name>)

注意:-

<relationship-label-name>可以是来自Neo4j数据库的节点或关系的属性名称。

使用示例

MATCH (a)-[movie:ACTION_MOVIES]->(b) 
RETURN STARTNODE(movie)
MATCH (a)-[movie:ACTION_MOVIES]->(b) 
RETURN ENDNODE(movie)

2.2.2 ID和TYPE

ID和TYPE关系函数来检索关系的Id和类型详细信息。

MATCH (a)-[movie:ACTION_MOVIES]->(b) 
RETURN ID(movie),TYPE(movie)

三 索引

Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。可以为具有相同标签名称的所有节点的属性创建索引,也可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。

  • Create Index 创建索引
  • Drop Index 丢弃索引

3.1 创建索引

创建索引语法:

Neo4j的CQL提供“CREATE INDEX”命令创建的节点或关系的属性索引。

创建索引的语法:

CREATE INDEX ON :<label_name> (<property_name>)

注意:-

冒号(:)运算符用于引用节点或关系标签名称。

上述语法描述它在节点或关系的上创建一个新索引。

示例

CREATE INDEX ON :Customer (name)

3.2 丢弃索引

Neo4j CQL已提供“DROP INDEX”命令删除NODE或Relationship的属性的现有索引。

Drop Index语法:

DROP INDEX ON :<label_name> (<property_name>)

注意:-

冒号(:)运算符用于引用节点或关系标签名称。

上述语法描述它删除在节点或关系的上创建的现有索引。

示例

DROP INDEX ON :Customer (name)

四 约束

在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据对某些节点或关系的应用需求,必须避免这种重复。 然后不能直接得到这个。 应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。

像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束

UNIQUE约束的优点

  • 避免重复记录。
  • 强制执行数据完整性规则。

Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。

4.1 创建约束

创建唯一约束语法

CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE

语法说明:

语法元素 描述
CREATE CONSTRAINT ON 它是一个Neo4j CQL关键字。
<label_name> 它是节点或关系的标签名称。
ASSERT 它是一个Neo4j CQL关键字。
<property_name> 它是节点或关系的属性名称。
IS UNIQUE 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。

注意:-

上述语法描述了它的 节点或关系创造了一个独特的约束。

4.2 删除约束

Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。

删除UNIQUE约束语法:

DROP CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE

语法说明

语法元素 描述
DROP CONSTRAINT ON 它是一个Neo4j CQL关键字。
<label_name> 它是节点或关系的标签名称。
ASSERT 它是一个Neo4j CQL关键字。
<property_name> 它是节点或关系的属性名称。
IS UNIQUE 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。

注意 -

上述语法描述它从节点或关系的中删除唯一约束。

五 官方示例

5.1 初始化脚本

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix)

CREATE (Emil:Person {name:"Emil Eifrem", born:1978})
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)

CREATE (TheMatrixReloaded:Movie {title:'The Matrix Reloaded', released:2003, tagline:'Free your mind'})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixReloaded),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrixReloaded),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrixReloaded),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrixReloaded),
(LillyW)-[:DIRECTED]->(TheMatrixReloaded),
(LanaW)-[:DIRECTED]->(TheMatrixReloaded),
(JoelS)-[:PRODUCED]->(TheMatrixReloaded)

CREATE (TheMatrixRevolutions:Movie {title:'The Matrix Revolutions', released:2003, tagline:'Everything that has a beginning has an end'})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixRevolutions),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrixRevolutions),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrixRevolutions),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrixRevolutions),
(LillyW)-[:DIRECTED]->(TheMatrixRevolutions),
(LanaW)-[:DIRECTED]->(TheMatrixRevolutions),
(JoelS)-[:PRODUCED]->(TheMatrixRevolutions)

CREATE (TheDevilsAdvocate:Movie {title:"The Devil's Advocate", released:1997, tagline:'Evil has its winning ways'})
CREATE (Charlize:Person {name:'Charlize Theron', born:1975})
CREATE (Al:Person {name:'Al Pacino', born:1940})
CREATE (Taylor:Person {name:'Taylor Hackford', born:1944})
CREATE
(Keanu)-[:ACTED_IN {roles:['Kevin Lomax']}]->(TheDevilsAdvocate),
(Charlize)-[:ACTED_IN {roles:['Mary Ann Lomax']}]->(TheDevilsAdvocate),
(Al)-[:ACTED_IN {roles:['John Milton']}]->(TheDevilsAdvocate),
(Taylor)-[:DIRECTED]->(TheDevilsAdvocate)

CREATE (AFewGoodMen:Movie {title:"A Few Good Men", released:1992, tagline:"In the heart of the nation's capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth."})
CREATE (TomC:Person {name:'Tom Cruise', born:1962})
CREATE (JackN:Person {name:'Jack Nicholson', born:1937})
CREATE (DemiM:Person {name:'Demi Moore', born:1962})
CREATE (KevinB:Person {name:'Kevin Bacon', born:1958})
CREATE (KieferS:Person {name:'Kiefer Sutherland', born:1966})
CREATE (NoahW:Person {name:'Noah Wyle', born:1971})
CREATE (CubaG:Person {name:'Cuba Gooding Jr.', born:1968})
CREATE (KevinP:Person {name:'Kevin Pollak', born:1957})
CREATE (JTW:Person {name:'J.T. Walsh', born:1943})
CREATE (JamesM:Person {name:'James Marshall', born:1967})
CREATE (ChristopherG:Person {name:'Christopher Guest', born:1948})
CREATE (RobR:Person {name:'Rob Reiner', born:1947})
CREATE (AaronS:Person {name:'Aaron Sorkin', born:1961})
CREATE
(TomC)-[:ACTED_IN {roles:['Lt. Daniel Kaffee']}]->(AFewGoodMen),
(JackN)-[:ACTED_IN {roles:['Col. Nathan R. Jessup']}]->(AFewGoodMen),
(DemiM)-[:ACTED_IN {roles:['Lt. Cdr. JoAnne Galloway']}]->(AFewGoodMen),
(KevinB)-[:ACTED_IN {roles:['Capt. Jack Ross']}]->(AFewGoodMen),
(KieferS)-[:ACTED_IN {roles:['Lt. Jonathan Kendrick']}]->(AFewGoodMen),
(NoahW)-[:ACTED_IN {roles:['Cpl. Jeffrey Barnes']}]->(AFewGoodMen),
(CubaG)-[:ACTED_IN {roles:['Cpl. Carl Hammaker']}]->(AFewGoodMen),
(KevinP)-[:ACTED_IN {roles:['Lt. Sam Weinberg']}]->(AFewGoodMen),
(JTW)-[:ACTED_IN {roles:['Lt. Col. Matthew Andrew Markinson']}]->(AFewGoodMen),
(JamesM)-[:ACTED_IN {roles:['Pfc. Louden Downey']}]->(AFewGoodMen),
(ChristopherG)-[:ACTED_IN {roles:['Dr. Stone']}]->(AFewGoodMen),
(AaronS)-[:ACTED_IN {roles:['Man in Bar']}]->(AFewGoodMen),
(RobR)-[:DIRECTED]->(AFewGoodMen),
(AaronS)-[:WROTE]->(AFewGoodMen)

CREATE (TopGun:Movie {title:"Top Gun", released:1986, tagline:'I feel the need, the need for speed.'})
CREATE (KellyM:Person {name:'Kelly McGillis', born:1957})
CREATE (ValK:Person {name:'Val Kilmer', born:1959})
CREATE (AnthonyE:Person {name:'Anthony Edwards', born:1962})
CREATE (TomS:Person {name:'Tom Skerritt', born:1933})
CREATE (MegR:Person {name:'Meg Ryan', born:1961})
CREATE (TonyS:Person {name:'Tony Scott', born:1944})
CREATE (JimC:Person {name:'Jim Cash', born:1941})
CREATE
(TomC)-[:ACTED_IN {roles:['Maverick']}]->(TopGun),
(KellyM)-[:ACTED_IN {roles:['Charlie']}]->(TopGun),
(ValK)-[:ACTED_IN {roles:['Iceman']}]->(TopGun),
(AnthonyE)-[:ACTED_IN {roles:['Goose']}]->(TopGun),
(TomS)-[:ACTED_IN {roles:['Viper']}]->(TopGun),
(MegR)-[:ACTED_IN {roles:['Carole']}]->(TopGun),
(TonyS)-[:DIRECTED]->(TopGun),
(JimC)-[:WROTE]->(TopGun)

CREATE (JerryMaguire:Movie {title:'Jerry Maguire', released:2000, tagline:'The rest of his life begins now.'})
CREATE (ReneeZ:Person {name:'Renee Zellweger', born:1969})
CREATE (KellyP:Person {name:'Kelly Preston', born:1962})
CREATE (JerryO:Person {name:"Jerry O'Connell", born:1974})
CREATE (JayM:Person {name:'Jay Mohr', born:1970})
CREATE (BonnieH:Person {name:'Bonnie Hunt', born:1961})
CREATE (ReginaK:Person {name:'Regina King', born:1971})
CREATE (JonathanL:Person {name:'Jonathan Lipnicki', born:1996})
CREATE (CameronC:Person {name:'Cameron Crowe', born:1957})
CREATE
(TomC)-[:ACTED_IN {roles:['Jerry Maguire']}]->(JerryMaguire),
(CubaG)-[:ACTED_IN {roles:['Rod Tidwell']}]->(JerryMaguire),
(ReneeZ)-[:ACTED_IN {roles:['Dorothy Boyd']}]->(JerryMaguire),
(KellyP)-[:ACTED_IN {roles:['Avery Bishop']}]->(JerryMaguire),
(JerryO)-[:ACTED_IN {roles:['Frank Cushman']}]->(JerryMaguire),
(JayM)-[:ACTED_IN {roles:['Bob Sugar']}]->(JerryMaguire),
(BonnieH)-[:ACTED_IN {roles:['Laurel Boyd']}]->(JerryMaguire),
(ReginaK)-[:ACTED_IN {roles:['Marcee Tidwell']}]->(JerryMaguire),
(JonathanL)-[:ACTED_IN {roles:['Ray Boyd']}]->(JerryMaguire),
(CameronC)-[:DIRECTED]->(JerryMaguire),
(CameronC)-[:PRODUCED]->(JerryMaguire),
(CameronC)-[:WROTE]->(JerryMaguire)

CREATE (StandByMe:Movie {title:"Stand By Me", released:1986, tagline:"For some, it's the last real taste of innocence, and the first real taste of life. But for everyone, it's the time that memories are made of."})
CREATE (RiverP:Person {name:'River Phoenix', born:1970})
CREATE (CoreyF:Person {name:'Corey Feldman', born:1971})
CREATE (WilW:Person {name:'Wil Wheaton', born:1972})
CREATE (JohnC:Person {name:'John Cusack', born:1966})
CREATE (MarshallB:Person {name:'Marshall Bell', born:1942})
CREATE
(WilW)-[:ACTED_IN {roles:['Gordie Lachance']}]->(StandByMe),
(RiverP)-[:ACTED_IN {roles:['Chris Chambers']}]->(StandByMe),
(JerryO)-[:ACTED_IN {roles:['Vern Tessio']}]->(StandByMe),
(CoreyF)-[:ACTED_IN {roles:['Teddy Duchamp']}]->(StandByMe),
(JohnC)-[:ACTED_IN {roles:['Denny Lachance']}]->(StandByMe),
(KieferS)-[:ACTED_IN {roles:['Ace Merrill']}]->(StandByMe),
(MarshallB)-[:ACTED_IN {roles:['Mr. Lachance']}]->(StandByMe),
(RobR)-[:DIRECTED]->(StandByMe)

CREATE (AsGoodAsItGets:Movie {title:'As Good as It Gets', released:1997, tagline:'A comedy from the heart that goes for the throat.'})
CREATE (HelenH:Person {name:'Helen Hunt', born:1963})
CREATE (GregK:Person {name:'Greg Kinnear', born:1963})
CREATE (JamesB:Person {name:'James L. Brooks', born:1940})
CREATE
(JackN)-[:ACTED_IN {roles:['Melvin Udall']}]->(AsGoodAsItGets),
(HelenH)-[:ACTED_IN {roles:['Carol Connelly']}]->(AsGoodAsItGets),
(GregK)-[:ACTED_IN {roles:['Simon Bishop']}]->(AsGoodAsItGets),
(CubaG)-[:ACTED_IN {roles:['Frank Sachs']}]->(AsGoodAsItGets),
(JamesB)-[:DIRECTED]->(AsGoodAsItGets)

CREATE (WhatDreamsMayCome:Movie {title:'What Dreams May Come', released:1998, tagline:'After life there is more. The end is just the beginning.'})
CREATE (AnnabellaS:Person {name:'Annabella Sciorra', born:1960})
CREATE (MaxS:Person {name:'Max von Sydow', born:1929})
CREATE (WernerH:Person {name:'Werner Herzog', born:1942})
CREATE (Robin:Person {name:'Robin Williams', born:1951})
CREATE (VincentW:Person {name:'Vincent Ward', born:1956})
CREATE
(Robin)-[:ACTED_IN {roles:['Chris Nielsen']}]->(WhatDreamsMayCome),
(CubaG)-[:ACTED_IN {roles:['Albert Lewis']}]->(WhatDreamsMayCome),
(AnnabellaS)-[:ACTED_IN {roles:['Annie Collins-Nielsen']}]->(WhatDreamsMayCome),
(MaxS)-[:ACTED_IN {roles:['The Tracker']}]->(WhatDreamsMayCome),
(WernerH)-[:ACTED_IN {roles:['The Face']}]->(WhatDreamsMayCome),
(VincentW)-[:DIRECTED]->(WhatDreamsMayCome)

CREATE (SnowFallingonCedars:Movie {title:'Snow Falling on Cedars', released:1999, tagline:'First loves last. Forever.'})
CREATE (EthanH:Person {name:'Ethan Hawke', born:1970})
CREATE (RickY:Person {name:'Rick Yune', born:1971})
CREATE (JamesC:Person {name:'James Cromwell', born:1940})
CREATE (ScottH:Person {name:'Scott Hicks', born:1953})
CREATE
(EthanH)-[:ACTED_IN {roles:['Ishmael Chambers']}]->(SnowFallingonCedars),
(RickY)-[:ACTED_IN {roles:['Kazuo Miyamoto']}]->(SnowFallingonCedars),
(MaxS)-[:ACTED_IN {roles:['Nels Gudmundsson']}]->(SnowFallingonCedars),
(JamesC)-[:ACTED_IN {roles:['Judge Fielding']}]->(SnowFallingonCedars),
(ScottH)-[:DIRECTED]->(SnowFallingonCedars)

CREATE (YouveGotMail:Movie {title:"You've Got Mail", released:1998, tagline:'At odds in life... in love on-line.'})
CREATE (ParkerP:Person {name:'Parker Posey', born:1968})
CREATE (DaveC:Person {name:'Dave Chappelle', born:1973})
CREATE (SteveZ:Person {name:'Steve Zahn', born:1967})
CREATE (TomH:Person {name:'Tom Hanks', born:1956})
CREATE (NoraE:Person {name:'Nora Ephron', born:1941})
CREATE
(TomH)-[:ACTED_IN {roles:['Joe Fox']}]->(YouveGotMail),
(MegR)-[:ACTED_IN {roles:['Kathleen Kelly']}]->(YouveGotMail),
(GregK)-[:ACTED_IN {roles:['Frank Navasky']}]->(YouveGotMail),
(ParkerP)-[:ACTED_IN {roles:['Patricia Eden']}]->(YouveGotMail),
(DaveC)-[:ACTED_IN {roles:['Kevin Jackson']}]->(YouveGotMail),
(SteveZ)-[:ACTED_IN {roles:['George Pappas']}]->(YouveGotMail),
(NoraE)-[:DIRECTED]->(YouveGotMail)

CREATE (SleeplessInSeattle:Movie {title:'Sleepless in Seattle', released:1993, tagline:'What if someone you never met, someone you never saw, someone you never knew was the only someone for you?'})
CREATE (RitaW:Person {name:'Rita Wilson', born:1956})
CREATE (BillPull:Person {name:'Bill Pullman', born:1953})
CREATE (VictorG:Person {name:'Victor Garber', born:1949})
CREATE (RosieO:Person {name:"Rosie O'Donnell", born:1962})
CREATE
(TomH)-[:ACTED_IN {roles:['Sam Baldwin']}]->(SleeplessInSeattle),
(MegR)-[:ACTED_IN {roles:['Annie Reed']}]->(SleeplessInSeattle),
(RitaW)-[:ACTED_IN {roles:['Suzy']}]->(SleeplessInSeattle),
(BillPull)-[:ACTED_IN {roles:['Walter']}]->(SleeplessInSeattle),
(VictorG)-[:ACTED_IN {roles:['Greg']}]->(SleeplessInSeattle),
(RosieO)-[:ACTED_IN {roles:['Becky']}]->(SleeplessInSeattle),
(NoraE)-[:DIRECTED]->(SleeplessInSeattle)

CREATE (JoeVersustheVolcano:Movie {title:'Joe Versus the Volcano', released:1990, tagline:'A story of love, lava and burning desire.'})
CREATE (JohnS:Person {name:'John Patrick Stanley', born:1950})
CREATE (Nathan:Person {name:'Nathan Lane', born:1956})
CREATE
(TomH)-[:ACTED_IN {roles:['Joe Banks']}]->(JoeVersustheVolcano),
(MegR)-[:ACTED_IN {roles:['DeDe', 'Angelica Graynamore', 'Patricia Graynamore']}]->(JoeVersustheVolcano),
(Nathan)-[:ACTED_IN {roles:['Baw']}]->(JoeVersustheVolcano),
(JohnS)-[:DIRECTED]->(JoeVersustheVolcano)

CREATE (WhenHarryMetSally:Movie {title:'When Harry Met Sally', released:1998, tagline:'Can two friends sleep together and still love each other in the morning?'})
CREATE (BillyC:Person {name:'Billy Crystal', born:1948})
CREATE (CarrieF:Person {name:'Carrie Fisher', born:1956})
CREATE (BrunoK:Person {name:'Bruno Kirby', born:1949})
CREATE
(BillyC)-[:ACTED_IN {roles:['Harry Burns']}]->(WhenHarryMetSally),
(MegR)-[:ACTED_IN {roles:['Sally Albright']}]->(WhenHarryMetSally),
(CarrieF)-[:ACTED_IN {roles:['Marie']}]->(WhenHarryMetSally),
(BrunoK)-[:ACTED_IN {roles:['Jess']}]->(WhenHarryMetSally),
(RobR)-[:DIRECTED]->(WhenHarryMetSally),
(RobR)-[:PRODUCED]->(WhenHarryMetSally),
(NoraE)-[:PRODUCED]->(WhenHarryMetSally),
(NoraE)-[:WROTE]->(WhenHarryMetSally)

CREATE (ThatThingYouDo:Movie {title:'That Thing You Do', released:1996, tagline:'In every life there comes a time when that thing you dream becomes that thing you do'})
CREATE (LivT:Person {name:'Liv Tyler', born:1977})
CREATE
(TomH)-[:ACTED_IN {roles:['Mr. White']}]->(ThatThingYouDo),
(LivT)-[:ACTED_IN {roles:['Faye Dolan']}]->(ThatThingYouDo),
(Charlize)-[:ACTED_IN {roles:['Tina']}]->(ThatThingYouDo),
(TomH)-[:DIRECTED]->(ThatThingYouDo)

CREATE (TheReplacements:Movie {title:'The Replacements', released:2000, tagline:'Pain heals, Chicks dig scars... Glory lasts forever'})
CREATE (Brooke:Person {name:'Brooke Langton', born:1970})
CREATE (Gene:Person {name:'Gene Hackman', born:1930})
CREATE (Orlando:Person {name:'Orlando Jones', born:1968})
CREATE (Howard:Person {name:'Howard Deutch', born:1950})
CREATE
(Keanu)-[:ACTED_IN {roles:['Shane Falco']}]->(TheReplacements),
(Brooke)-[:ACTED_IN {roles:['Annabelle Farrell']}]->(TheReplacements),
(Gene)-[:ACTED_IN {roles:['Jimmy McGinty']}]->(TheReplacements),
(Orlando)-[:ACTED_IN {roles:['Clifford Franklin']}]->(TheReplacements),
(Howard)-[:DIRECTED]->(TheReplacements)

CREATE (RescueDawn:Movie {title:'RescueDawn', released:2006, tagline:"Based on the extraordinary true story of one man's fight for freedom"})
CREATE (ChristianB:Person {name:'Christian Bale', born:1974})
CREATE (ZachG:Person {name:'Zach Grenier', born:1954})
CREATE
(MarshallB)-[:ACTED_IN {roles:['Admiral']}]->(RescueDawn),
(ChristianB)-[:ACTED_IN {roles:['Dieter Dengler']}]->(RescueDawn),
(ZachG)-[:ACTED_IN {roles:['Squad Leader']}]->(RescueDawn),
(SteveZ)-[:ACTED_IN {roles:['Duane']}]->(RescueDawn),
(WernerH)-[:DIRECTED]->(RescueDawn)

CREATE (TheBirdcage:Movie {title:'The Birdcage', released:1996, tagline:'Come as you are'})
CREATE (MikeN:Person {name:'Mike Nichols', born:1931})
CREATE
(Robin)-[:ACTED_IN {roles:['Armand Goldman']}]->(TheBirdcage),
(Nathan)-[:ACTED_IN {roles:['Albert Goldman']}]->(TheBirdcage),
(Gene)-[:ACTED_IN {roles:['Sen. Kevin Keeley']}]->(TheBirdcage),
(MikeN)-[:DIRECTED]->(TheBirdcage)

CREATE (Unforgiven:Movie {title:'Unforgiven', released:1992, tagline:"It's a hell of a thing, killing a man"})
CREATE (RichardH:Person {name:'Richard Harris', born:1930})
CREATE (ClintE:Person {name:'Clint Eastwood', born:1930})
CREATE
(RichardH)-[:ACTED_IN {roles:['English Bob']}]->(Unforgiven),
(ClintE)-[:ACTED_IN {roles:['Bill Munny']}]->(Unforgiven),
(Gene)-[:ACTED_IN {roles:['Little Bill Daggett']}]->(Unforgiven),
(ClintE)-[:DIRECTED]->(Unforgiven)

CREATE (JohnnyMnemonic:Movie {title:'Johnny Mnemonic', released:1995, tagline:'The hottest data on earth. In the coolest head in town'})
CREATE (Takeshi:Person {name:'Takeshi Kitano', born:1947})
CREATE (Dina:Person {name:'Dina Meyer', born:1968})
CREATE (IceT:Person {name:'Ice-T', born:1958})
CREATE (RobertL:Person {name:'Robert Longo', born:1953})
CREATE
(Keanu)-[:ACTED_IN {roles:['Johnny Mnemonic']}]->(JohnnyMnemonic),
(Takeshi)-[:ACTED_IN {roles:['Takahashi']}]->(JohnnyMnemonic),
(Dina)-[:ACTED_IN {roles:['Jane']}]->(JohnnyMnemonic),
(IceT)-[:ACTED_IN {roles:['J-Bone']}]->(JohnnyMnemonic),
(RobertL)-[:DIRECTED]->(JohnnyMnemonic)

CREATE (CloudAtlas:Movie {title:'Cloud Atlas', released:2012, tagline:'Everything is connected'})
CREATE (HalleB:Person {name:'Halle Berry', born:1966})
CREATE (JimB:Person {name:'Jim Broadbent', born:1949})
CREATE (TomT:Person {name:'Tom Tykwer', born:1965})
CREATE (DavidMitchell:Person {name:'David Mitchell', born:1969})
CREATE (StefanArndt:Person {name:'Stefan Arndt', born:1961})
CREATE
(TomH)-[:ACTED_IN {roles:['Zachry', 'Dr. Henry Goose', 'Isaac Sachs', 'Dermot Hoggins']}]->(CloudAtlas),
(Hugo)-[:ACTED_IN {roles:['Bill Smoke', 'Haskell Moore', 'Tadeusz Kesselring', 'Nurse Noakes', 'Boardman Mephi', 'Old Georgie']}]->(CloudAtlas),
(HalleB)-[:ACTED_IN {roles:['Luisa Rey', 'Jocasta Ayrs', 'Ovid', 'Meronym']}]->(CloudAtlas),
(JimB)-[:ACTED_IN {roles:['Vyvyan Ayrs', 'Captain Molyneux', 'Timothy Cavendish']}]->(CloudAtlas),
(TomT)-[:DIRECTED]->(CloudAtlas),
(LillyW)-[:DIRECTED]->(CloudAtlas),
(LanaW)-[:DIRECTED]->(CloudAtlas),
(DavidMitchell)-[:WROTE]->(CloudAtlas),
(StefanArndt)-[:PRODUCED]->(CloudAtlas)

CREATE (TheDaVinciCode:Movie {title:'The Da Vinci Code', released:2006, tagline:'Break The Codes'})
CREATE (IanM:Person {name:'Ian McKellen', born:1939})
CREATE (AudreyT:Person {name:'Audrey Tautou', born:1976})
CREATE (PaulB:Person {name:'Paul Bettany', born:1971})
CREATE (RonH:Person {name:'Ron Howard', born:1954})
CREATE
(TomH)-[:ACTED_IN {roles:['Dr. Robert Langdon']}]->(TheDaVinciCode),
(IanM)-[:ACTED_IN {roles:['Sir Leight Teabing']}]->(TheDaVinciCode),
(AudreyT)-[:ACTED_IN {roles:['Sophie Neveu']}]->(TheDaVinciCode),
(PaulB)-[:ACTED_IN {roles:['Silas']}]->(TheDaVinciCode),
(RonH)-[:DIRECTED]->(TheDaVinciCode)

CREATE (VforVendetta:Movie {title:'V for Vendetta', released:2006, tagline:'Freedom! Forever!'})
CREATE (NatalieP:Person {name:'Natalie Portman', born:1981})
CREATE (StephenR:Person {name:'Stephen Rea', born:1946})
CREATE (JohnH:Person {name:'John Hurt', born:1940})
CREATE (BenM:Person {name: 'Ben Miles', born:1967})
CREATE
(Hugo)-[:ACTED_IN {roles:['V']}]->(VforVendetta),
(NatalieP)-[:ACTED_IN {roles:['Evey Hammond']}]->(VforVendetta),
(StephenR)-[:ACTED_IN {roles:['Eric Finch']}]->(VforVendetta),
(JohnH)-[:ACTED_IN {roles:['High Chancellor Adam Sutler']}]->(VforVendetta),
(BenM)-[:ACTED_IN {roles:['Dascomb']}]->(VforVendetta),
(JamesM)-[:DIRECTED]->(VforVendetta),
(LillyW)-[:PRODUCED]->(VforVendetta),
(LanaW)-[:PRODUCED]->(VforVendetta),
(JoelS)-[:PRODUCED]->(VforVendetta),
(LillyW)-[:WROTE]->(VforVendetta),
(LanaW)-[:WROTE]->(VforVendetta)

CREATE (SpeedRacer:Movie {title:'Speed Racer', released:2008, tagline:'Speed has no limits'})
CREATE (EmileH:Person {name:'Emile Hirsch', born:1985})
CREATE (JohnG:Person {name:'John Goodman', born:1960})
CREATE (SusanS:Person {name:'Susan Sarandon', born:1946})
CREATE (MatthewF:Person {name:'Matthew Fox', born:1966})
CREATE (ChristinaR:Person {name:'Christina Ricci', born:1980})
CREATE (Rain:Person {name:'Rain', born:1982})
CREATE
(EmileH)-[:ACTED_IN {roles:['Speed Racer']}]->(SpeedRacer),
(JohnG)-[:ACTED_IN {roles:['Pops']}]->(SpeedRacer),
(SusanS)-[:ACTED_IN {roles:['Mom']}]->(SpeedRacer),
(MatthewF)-[:ACTED_IN {roles:['Racer X']}]->(SpeedRacer),
(ChristinaR)-[:ACTED_IN {roles:['Trixie']}]->(SpeedRacer),
(Rain)-[:ACTED_IN {roles:['Taejo Togokahn']}]->(SpeedRacer),
(BenM)-[:ACTED_IN {roles:['Cass Jones']}]->(SpeedRacer),
(LillyW)-[:DIRECTED]->(SpeedRacer),
(LanaW)-[:DIRECTED]->(SpeedRacer),
(LillyW)-[:WROTE]->(SpeedRacer),
(LanaW)-[:WROTE]->(SpeedRacer),
(JoelS)-[:PRODUCED]->(SpeedRacer)

CREATE (NinjaAssassin:Movie {title:'Ninja Assassin', released:2009, tagline:'Prepare to enter a secret world of assassins'})
CREATE (NaomieH:Person {name:'Naomie Harris'})
CREATE
(Rain)-[:ACTED_IN {roles:['Raizo']}]->(NinjaAssassin),
(NaomieH)-[:ACTED_IN {roles:['Mika Coretti']}]->(NinjaAssassin),
(RickY)-[:ACTED_IN {roles:['Takeshi']}]->(NinjaAssassin),
(BenM)-[:ACTED_IN {roles:['Ryan Maslow']}]->(NinjaAssassin),
(JamesM)-[:DIRECTED]->(NinjaAssassin),
(LillyW)-[:PRODUCED]->(NinjaAssassin),
(LanaW)-[:PRODUCED]->(NinjaAssassin),
(JoelS)-[:PRODUCED]->(NinjaAssassin)

CREATE (TheGreenMile:Movie {title:'The Green Mile', released:1999, tagline:"Walk a mile you'll never forget."})
CREATE (MichaelD:Person {name:'Michael Clarke Duncan', born:1957})
CREATE (DavidM:Person {name:'David Morse', born:1953})
CREATE (SamR:Person {name:'Sam Rockwell', born:1968})
CREATE (GaryS:Person {name:'Gary Sinise', born:1955})
CREATE (PatriciaC:Person {name:'Patricia Clarkson', born:1959})
CREATE (FrankD:Person {name:'Frank Darabont', born:1959})
CREATE
(TomH)-[:ACTED_IN {roles:['Paul Edgecomb']}]->(TheGreenMile),
(MichaelD)-[:ACTED_IN {roles:['John Coffey']}]->(TheGreenMile),
(DavidM)-[:ACTED_IN {roles:['Brutus "Brutal" Howell']}]->(TheGreenMile),
(BonnieH)-[:ACTED_IN {roles:['Jan Edgecomb']}]->(TheGreenMile),
(JamesC)-[:ACTED_IN {roles:['Warden Hal Moores']}]->(TheGreenMile),
(SamR)-[:ACTED_IN {roles:['"Wild Bill" Wharton']}]->(TheGreenMile),
(GaryS)-[:ACTED_IN {roles:['Burt Hammersmith']}]->(TheGreenMile),
(PatriciaC)-[:ACTED_IN {roles:['Melinda Moores']}]->(TheGreenMile),
(FrankD)-[:DIRECTED]->(TheGreenMile)

CREATE (FrostNixon:Movie {title:'Frost/Nixon', released:2008, tagline:'400 million people were waiting for the truth.'})
CREATE (FrankL:Person {name:'Frank Langella', born:1938})
CREATE (MichaelS:Person {name:'Michael Sheen', born:1969})
CREATE (OliverP:Person {name:'Oliver Platt', born:1960})
CREATE
(FrankL)-[:ACTED_IN {roles:['Richard Nixon']}]->(FrostNixon),
(MichaelS)-[:ACTED_IN {roles:['David Frost']}]->(FrostNixon),
(KevinB)-[:ACTED_IN {roles:['Jack Brennan']}]->(FrostNixon),
(OliverP)-[:ACTED_IN {roles:['Bob Zelnick']}]->(FrostNixon),
(SamR)-[:ACTED_IN {roles:['James Reston, Jr.']}]->(FrostNixon),
(RonH)-[:DIRECTED]->(FrostNixon)

CREATE (Hoffa:Movie {title:'Hoffa', released:1992, tagline:"He didn't want law. He wanted justice."})
CREATE (DannyD:Person {name:'Danny DeVito', born:1944})
CREATE (JohnR:Person {name:'John C. Reilly', born:1965})
CREATE
(JackN)-[:ACTED_IN {roles:['Hoffa']}]->(Hoffa),
(DannyD)-[:ACTED_IN {roles:['Robert "Bobby" Ciaro']}]->(Hoffa),
(JTW)-[:ACTED_IN {roles:['Frank Fitzsimmons']}]->(Hoffa),
(JohnR)-[:ACTED_IN {roles:['Peter "Pete" Connelly']}]->(Hoffa),
(DannyD)-[:DIRECTED]->(Hoffa)

CREATE (Apollo13:Movie {title:'Apollo 13', released:1995, tagline:'Houston, we have a problem.'})
CREATE (EdH:Person {name:'Ed Harris', born:1950})
CREATE (BillPax:Person {name:'Bill Paxton', born:1955})
CREATE
(TomH)-[:ACTED_IN {roles:['Jim Lovell']}]->(Apollo13),
(KevinB)-[:ACTED_IN {roles:['Jack Swigert']}]->(Apollo13),
(EdH)-[:ACTED_IN {roles:['Gene Kranz']}]->(Apollo13),
(BillPax)-[:ACTED_IN {roles:['Fred Haise']}]->(Apollo13),
(GaryS)-[:ACTED_IN {roles:['Ken Mattingly']}]->(Apollo13),
(RonH)-[:DIRECTED]->(Apollo13)

CREATE (Twister:Movie {title:'Twister', released:1996, tagline:"Don't Breathe. Don't Look Back."})
CREATE (PhilipH:Person {name:'Philip Seymour Hoffman', born:1967})
CREATE (JanB:Person {name:'Jan de Bont', born:1943})
CREATE
(BillPax)-[:ACTED_IN {roles:['Bill Harding']}]->(Twister),
(HelenH)-[:ACTED_IN {roles:['Dr. Jo Harding']}]->(Twister),
(ZachG)-[:ACTED_IN {roles:['Eddie']}]->(Twister),
(PhilipH)-[:ACTED_IN {roles:['Dustin "Dusty" Davis']}]->(Twister),
(JanB)-[:DIRECTED]->(Twister)

CREATE (CastAway:Movie {title:'Cast Away', released:2000, tagline:'At the edge of the world, his journey begins.'})
CREATE (RobertZ:Person {name:'Robert Zemeckis', born:1951})
CREATE
(TomH)-[:ACTED_IN {roles:['Chuck Noland']}]->(CastAway),
(HelenH)-[:ACTED_IN {roles:['Kelly Frears']}]->(CastAway),
(RobertZ)-[:DIRECTED]->(CastAway)

CREATE (OneFlewOvertheCuckoosNest:Movie {title:"One Flew Over the Cuckoo's Nest", released:1975, tagline:"If he's crazy, what does that make you?"})
CREATE (MilosF:Person {name:'Milos Forman', born:1932})
CREATE
(JackN)-[:ACTED_IN {roles:['Randle McMurphy']}]->(OneFlewOvertheCuckoosNest),
(DannyD)-[:ACTED_IN {roles:['Martini']}]->(OneFlewOvertheCuckoosNest),
(MilosF)-[:DIRECTED]->(OneFlewOvertheCuckoosNest)

CREATE (SomethingsGottaGive:Movie {title:"Something's Gotta Give", released:2003})
CREATE (DianeK:Person {name:'Diane Keaton', born:1946})
CREATE (NancyM:Person {name:'Nancy Meyers', born:1949})
CREATE
(JackN)-[:ACTED_IN {roles:['Harry Sanborn']}]->(SomethingsGottaGive),
(DianeK)-[:ACTED_IN {roles:['Erica Barry']}]->(SomethingsGottaGive),
(Keanu)-[:ACTED_IN {roles:['Julian Mercer']}]->(SomethingsGottaGive),
(NancyM)-[:DIRECTED]->(SomethingsGottaGive),
(NancyM)-[:PRODUCED]->(SomethingsGottaGive),
(NancyM)-[:WROTE]->(SomethingsGottaGive)

CREATE (BicentennialMan:Movie {title:'Bicentennial Man', released:1999, tagline:"One robot's 200 year journey to become an ordinary man."})
CREATE (ChrisC:Person {name:'Chris Columbus', born:1958})
CREATE
(Robin)-[:ACTED_IN {roles:['Andrew Marin']}]->(BicentennialMan),
(OliverP)-[:ACTED_IN {roles:['Rupert Burns']}]->(BicentennialMan),
(ChrisC)-[:DIRECTED]->(BicentennialMan)

CREATE (CharlieWilsonsWar:Movie {title:"Charlie Wilson's War", released:2007, tagline:"A stiff drink. A little mascara. A lot of nerve. Who said they couldn't bring down the Soviet empire."})
CREATE (JuliaR:Person {name:'Julia Roberts', born:1967})
CREATE
(TomH)-[:ACTED_IN {roles:['Rep. Charlie Wilson']}]->(CharlieWilsonsWar),
(JuliaR)-[:ACTED_IN {roles:['Joanne Herring']}]->(CharlieWilsonsWar),
(PhilipH)-[:ACTED_IN {roles:['Gust Avrakotos']}]->(CharlieWilsonsWar),
(MikeN)-[:DIRECTED]->(CharlieWilsonsWar)

CREATE (ThePolarExpress:Movie {title:'The Polar Express', released:2004, tagline:'This Holiday Season... Believe'})
CREATE
(TomH)-[:ACTED_IN {roles:['Hero Boy', 'Father', 'Conductor', 'Hobo', 'Scrooge', 'Santa Claus']}]->(ThePolarExpress),
(RobertZ)-[:DIRECTED]->(ThePolarExpress)

CREATE (ALeagueofTheirOwn:Movie {title:'A League of Their Own', released:1992, tagline:'Once in a lifetime you get a chance to do something different.'})
CREATE (Madonna:Person {name:'Madonna', born:1954})
CREATE (GeenaD:Person {name:'Geena Davis', born:1956})
CREATE (LoriP:Person {name:'Lori Petty', born:1963})
CREATE (PennyM:Person {name:'Penny Marshall', born:1943})
CREATE
(TomH)-[:ACTED_IN {roles:['Jimmy Dugan']}]->(ALeagueofTheirOwn),
(GeenaD)-[:ACTED_IN {roles:['Dottie Hinson']}]->(ALeagueofTheirOwn),
(LoriP)-[:ACTED_IN {roles:['Kit Keller']}]->(ALeagueofTheirOwn),
(RosieO)-[:ACTED_IN {roles:['Doris Murphy']}]->(ALeagueofTheirOwn),
(Madonna)-[:ACTED_IN {roles:['"All the Way" Mae Mordabito']}]->(ALeagueofTheirOwn),
(BillPax)-[:ACTED_IN {roles:['Bob Hinson']}]->(ALeagueofTheirOwn),
(PennyM)-[:DIRECTED]->(ALeagueofTheirOwn)

CREATE (PaulBlythe:Person {name:'Paul Blythe'})
CREATE (AngelaScope:Person {name:'Angela Scope'})
CREATE (JessicaThompson:Person {name:'Jessica Thompson'})
CREATE (JamesThompson:Person {name:'James Thompson'})

CREATE
(JamesThompson)-[:FOLLOWS]->(JessicaThompson),
(AngelaScope)-[:FOLLOWS]->(JessicaThompson),
(PaulBlythe)-[:FOLLOWS]->(AngelaScope)

CREATE
(JessicaThompson)-[:REVIEWED {summary:'An amazing journey', rating:95}]->(CloudAtlas),
(JessicaThompson)-[:REVIEWED {summary:'Silly, but fun', rating:65}]->(TheReplacements),
(JamesThompson)-[:REVIEWED {summary:'The coolest football movie ever', rating:100}]->(TheReplacements),
(AngelaScope)-[:REVIEWED {summary:'Pretty funny at times', rating:62}]->(TheReplacements),
(JessicaThompson)-[:REVIEWED {summary:'Dark, but compelling', rating:85}]->(Unforgiven),
(JessicaThompson)-[:REVIEWED {summary:"Slapstick redeemed only by the Robin Williams and Gene Hackman's stellar performances", rating:45}]->(TheBirdcage),
(JessicaThompson)-[:REVIEWED {summary:'A solid romp', rating:68}]->(TheDaVinciCode),
(JamesThompson)-[:REVIEWED {summary:'Fun, but a little far fetched', rating:65}]->(TheDaVinciCode),
(JessicaThompson)-[:REVIEWED {summary:'You had me at Jerry', rating:92}]->(JerryMaguire)

WITH TomH as a
MATCH (a)-[:ACTED_IN]->(m)<-[:DIRECTED]-(d) RETURN a,m,d LIMIT 10;

执行成功后,可以看到数据如下图所示

image-20211103142316205

5.2 查询示例

5.2.1 找到名为“Tom Hanks”的演员。

MATCH (tom {name: "Tom Hanks"}) RETURN tom

结果如下:

image-20211103142450991


查询标题为“Cloud Atlas”的电影

image-20211103142621424


5.2.2 查询10个用户

MATCH (people:Person) RETURN people.name LIMIT 10

5.2.3 查找20世纪90年代发行的电影

MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title

5.2.4 列出所有 Tom Hanks 的电影

MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies

5.2.5 查询出谁导演了Cloud Atlas

MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name

5.2.6 查询出 Tom Hanks 的搭档

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name

5.2.7 查询出哪些人与Cloud Atlas有关系

MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo

5.2.8 电影和演员距离Kevin Bacon最多4个“跳跃”

MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood)
RETURN DISTINCT hollywood

5.2.9 培根路径,与Meg Ryan的任何关系中最短的路径

MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p

5.2.10 扩展Tom Hanks的合作演员,以找到没有与Tom Hanks合作过的合作演员

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC

5.2.11 找个人把Tom Hanks介绍给Tom Cruise

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
RETURN tom, m, coActors, m2, cruise

5.2.13 查询管理属性为Andrew Marin的记录

查询命令如下

MATCH (n1)-[r{roles:['Andrew Marin']}]->(n2) RETURN r, n1, n2 LIMIT 25

结果如下

image-20211116193303288

5.2.14 查询有一个关系角色为Conductor的记录

命令如下

MATCH (n1)-[r]->(n2) where "Conductor" in r.roles RETURN r, n1, n2

查询结果如下

image-20211116195647473

5.3 删除数据

删除所有电影和人物节点及其关系

MATCH (n) DETACH DELETE n

六 数据概况

6.1 统计全部节点数量

// Count all nodes
MATCH (n)
RETURN count(n)

6.2 统计全部关系的数量

// Count all relationships
MATCH ()-->() RETURN count(*);

6.3 查询全部的约束和索引

// Display constraints and indexes
:schema

image-20211103152838795

6.4 列出节点标签

// List node labels
CALL db.labels()

image-20211103151410541

6.5 列出关系类型

// List relationship types
CALL db.relationshipTypes()

image-20211103151343882

6.6 什么是相关的,如何关联

// What is related, and how
CALL db.schema.visualization()

image-20211103151314933

6.7 存在什么样的节点

// What kind of nodes exist
// Sample some nodes, reporting on property and relationship counts per node.
MATCH (n) WHERE rand() <= 0.1
RETURN
DISTINCT labels(n),
count(*) AS SampleSize,
avg(size(keys(n))) as Avg_PropertyCount,
min(size(keys(n))) as Min_PropertyCount,
max(size(keys(n))) as Max_PropertyCount,
avg(size( (n)-[]-() ) ) as Avg_RelationshipCount,
min(size( (n)-[]-() ) ) as Min_RelationshipCount,
max(size( (n)-[]-() ) ) as Max_RelationshipCount

image-20211103152948098

七 docker方式安装neo4j

7.1 快速安装

安装命令如下

docker run -d --name container_name \  //-d表示容器后台运行 --name指定容器名字
-p 7474:7474 -p 7687:7687 \ //映射容器的端口号到宿主机的端口号
-v /home/neo4j/data:/data \ //把容器内的数据目录挂载到宿主机的对应目录下
-v /home/neo4j/logs:/logs \ //挂载日志目录
-v /home/neo4j/conf:/var/lib/neo4j/conf //挂载配置目录
-v /home/neo4j/import:/var/lib/neo4j/import \ //挂载数据导入目录
--env NEO4J_AUTH=neo4j/password \ //设定数据库的名字的访问密码
neo4j //指定使用的镜像

解释如下

  • data——数据存放的文件夹
  • logs——运行的日志文件夹
  • conf——数据库配置文件夹(在配置文件neo4j.conf中配置包括开放远程连接、设置默认激活的数据库)
  • import——为了大批量导入csv来构建数据库,需要导入的节点文件nodes.csv和关系文件rel.csv需要放到这个文件夹下)

执行完上述命令后就在后台把neo4j容器启动起来了,这个时候你就能在宿主机的浏览器中输入 localhost:7474 输入用户名和密码就能登录到数据库了。

7.2 基础配置

上述方式启动的neo4j是按照默认的配置进行启动的,而默认的数据库配置是不允许远程登陆的,这样对于在服务器上使用docker搭载neo4j的同学来说,就很不方便了。所以我们对默认配置进行一些改变,改变如下:

// 进入容器配置目录挂载在宿主机的对应目录,我这里是/home/neo4j/conf
cd /home/neo4j/conf

// vim编辑器打开neo4j.conf
vim neo4j.conf

// 进行以下更改
//在文件配置末尾添加这一行
dbms.connectors.default_listen_address=0.0.0.0 //指定连接器的默认监听ip为0.0.0.0,即允许任何ip连接到数据库

//修改
dbms.connector.bolt.listen_address=0.0.0.0:7687 //取消注释并把对bolt请求的监听“地址:端口”改为“0.0.0.0:7687”
dbms.connector.http.listen_address=0.0.0.0:7474 //取消注释并把对http请求的监听“地址:端口”改为“0.0.0.0:7474”

保存后退出,重启neo4j容器,可以使用容器的省略id或者生成容器时指定的容器名进行重启。

防火墙设置

// 查看当前防火墙状态,若为“inactive”,则防火墙已关闭,不必进行接续操作。
sudo ufw status

// 若防火墙状态为“active”,则使用下列命令开放端口
sudo ufw allow 7474
sudo ufw allow 7687

// 重启防火墙
sudo ufw reload

7.3 数据导入

为了加快速度,使用官方的Neo4j-import进行导入

// 数据准备
清空data/databases/graph.db文件夹(如果有),将清洗好的结点文件nodes.csv和关系文件rel.csv拷贝到宿主机/home/neo4j/import中

// docker以exec方式进入容器的交互式终端
docker exec -it container_name(or container_id) /bin/bash

// 停掉neo4j
bin/neo4j stop

//使用如下命令导入
bin/neo4j-admin import \
--database=graph.db \ //指定导入的数据库,没有系统则会在data/databases下自动创建一个
--nodes ./import/nodes.csv //指定导入的节点文件位置
--relationships ./import/rel.csv //指定导入的关系文件位置
--skip-duplicate-nodes=true //设置重复节点自动过滤
--skip-bad-relationships=true //设置bad关系自动过滤

//可执行一行式终端命令
bin/neo4j-admin import --database=graph.db --nodes ./import/nodes.csv --relationships ./import/rel.csv --skip-duplicate-nodes=true --skip-bad-relationships=true

// 容器内启动neo4j
bin/neo4j start

// 退出交互式终端但是保证neo4j后台继续运行
ctrl + P + Q

//保险起见,重启neo4j容器
docker restart container_name(or container_id)

重启后使用另一台主机向服务器发送http请求进行远程登陆,在浏览器中输入服务器ip:7474

切换连接模式bolt:/ ,输入用户名和密码进行登陆,登陆成功发现在数据库一栏没找到新导入的数据库graph.db

这是因为配置不够全,继续进到容器挂载到宿主机的/home/neo4j/conf中对neo4j.conf进行配置

//在文件末尾添加默认的数据库
dbms.active_database=graph.db

// 保存后重启容器
docker restart container_name(or container_id)

重新进行远程连接,此时数据库的默认选择应该就切换到了新导入的graph.db。