neo4j是什么
neo4j是一种graph数据库,适用于超大量数据的增删改查。其默认语言为cypher。
学习资料
国内下载地址
使用
解压,用cmd进入解压后的安装路径下。然后
windows:bin\neo4j console
linux or mac:./bin/neo4j console
浏览器访问:http://localhost:7474/
初始用户名和密码都是neo4j
终止服务:在cmd使用ctrl+C
清空数据库
找到安装目录的data\databases\数据库名\和data\transactions\数据库名
将该文件夹下所有文件删除
然后重新启动数据库服务即可
注意:如果通过这种手动方式删除,若有残留项未删除干净将会导致数据库无法连接(不可用)。
CQL
CREATE
Neo4j使用CQL“CREATE”命令
- 创建没有属性的节点
- 使用属性创建节点
- 在没有属性的节点之间创建关系
- 使用属性创建节点之间的关系
- 为节点或关系创建单个或多个标签
CREATE (<node-name>:<label-name>)
例如
CREATE (emp:Employee)
<node-name>
是节点名称,不可用于直接访问,这个名称指的是当前节点<label-name>
属于的节点类别。
因此,<label-name>
可以被用于直接访问一个节点。
添加多个标签到节点
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
创建节点的完整用法:
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> | 属性是键值对。 定义将分配给创建节点的属性的值 |
创建边关系的完整用法:
CREATE (<node1-name>:<label1-name>)-
[(<relationship-name>:<relationship-label-name>)]
->(<node2-name>:<label2-name>)
语法元素 | 描述 |
---|---|
<relationship-name> | 边类型名称 |
<relationship-label-name> | 边标签 |
MATCH
Neo4j CQL MATCH命令用于:
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
MATCH
(
<node-name>:<label-name>
)
RETURN
Neo4j CQL RETURN子句用于
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
WHERE
WHERE <condition> <boolean-operator> <condition>
语法元素 | 描述 |
---|---|
<condition> | 布尔运算 |
<boolean-operator> | and,or,>,<>等等 |
布尔运算符:AND, OR, NOT, XOR
对数据库中特定的两个节点之间创建边关系:
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 (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
以及
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
DELETE
Neo4j使用CQL DELETE子句
- 删除节点。
- 删除节点及相关节点和关系。
删除节点
DELETE <node-name-list>
例如
MATCH (e: Employee) RETURN e
删除边关系
DELETE <node1-name>,<node2-name>,<relationship-name>
例如
MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r
以及
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
REMOVE
我们使用Neo4j CQL SET子句向现有节点或关系添加新属性。
我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
Neo4j CQL REMOVE命令用于
- 删除节点或关系的标签
- 删除节点或关系的属性
Neo4j CQL DELETE和REMOVE命令之间的主要区别
- DELETE操作用于删除节点和关联关系。
- REMOVE操作用于删除标签和属性。
Neo4j CQL DELETE和REMOVE命令之间的相似性
- 这两个命令不应单独使用。
- 两个命令都应该与MATCH命令一起使用。
总结:DELETE用于删除实体(点和边),REMOVE用于删除属性(标签)。
使用REMOVE删除属性:
REMOVE <property-name-list>
<property-name-list>
可以写成如下形式:
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>
例如
MATCH (book { id:122 })
REMOVE book.price
RETURN book
或者
MATCH (dc:DebitCard)
REMOVE dc.cvv
RETURN dc
使用REMOVE删除标签:
REMOVE <label-name-list>
<label-name-list>
可以写成如下形式:
<node-name>:<label2-name>,
....
<node-name>:<labeln-name>
例如
MATCH (m:Movie)
REMOVE m:Picture
SET
Neo4j CQL已提供SET子句来执行以下操作。
- 向现有节点或关系添加新属性
- 添加或更新属性值
SET <property-name-list>
<property-name-list>
可以写成如下形式:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
举例
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc
ORDER BY(Sorting排序)
默认情况下,它按升序ASC对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。
ORDER BY <property-name-list> [DESC]
<property-name-list>
可以写成如下形式:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
例如
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC
UNION
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
- UNION
- UNION ALL
限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
<MATCH Command1>
UNION
<MATCH Command2>
以及
<MATCH Command1>
UNION ALL
<MATCH Command2>
UNION ALL:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
例如
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
以及
MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
dc.valid_from as valid_from,dc.valid_to as valid_to
注意:首先查询有:cc.id,cc.number。
第二个查询有:dc.id,dc.number。
这里既有信用卡式和借记卡具有相同的属性名:身份证和号码,但他们有不同的节点名称前缀。这就是为什么UNION命令显示此错误消息。为了避免这种错误,Neo4j的CQL提供“AS”子句。像CQL,CQL Neo4j的“AS”子句用于给一些别名。
LIMIT和SKIP
- LIMIT x用于返回前x行结果
- SKIP x用于返回最后x行结果
例如
MATCH (emp:Employee)
RETURN emp
LIMIT 2
以及
MATCH (emp:Employee)
RETURN emp
SKIP 2
MERGE
Neo4j使用CQL MERGE命令
- 创建节点,关系和属性
- 为从数据库检索数据
MERGE命令是CREATE命令和MATCH命令的组合。
MERGE = CREATE + MATCH
MERGE用法
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
注意:Neo4j CQL MERGE命令语法与CQL CREATE命令类似。但区别在于,CREATE可以添加重复的节点,而MERGE添加节点时会自动检查该节点是否已经存在于当前数据库,若存在,则不添加,否则添加。
NULL和IN
MATCH (e:Employee)
WHERE e.id IS NOT NULL
RETURN e.id,e.name,e.sal,e.deptno
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno