开启远程访问
一、对于3.0以前的版本
在安装目录的 $NEO4J_HOME/conf/neo4j.conf 文件内,找到下面一行,将注释#号去掉就可以了 #dbms.connector.https.address=localhost:7473 改为 dbms.connector.https.address=0.0.0.0:7473 这样,远程其他电脑可以用本机的IP或者域名后面跟上7474 端口就能打开web界面了 如: https://:7473
当然,你的操作系统的防火墙也要确保开放了7474端口才行,防火墙怎样开放请自行针对自己的操作系统查找文档
二、对于3.1及以后的版本
在安装目录的 $NEO4J_HOME/conf/neo4j.conf 文件内,找到下面一行,将注释#号去掉就可以了 dbms.connectors.default_listen_address=0.0.0.0
数据类型
No | 数据类型 | 含义 |
---|---|---|
1 | boolean | 布尔;true or false |
2 | int | 整数 32 位 |
3 | short | 16位整数 |
4 | byte | 8位整数 |
5 | long | 64位整数 |
6 | float | 32位浮点数 |
7 | double | 64位浮点数 |
8 | char | 字符 16位 |
9 | string | 字符串 |
> 创建数据库
图形数据库对数据库的操作和mysql的比较相似,mysql数据库的思维可以拿来用,但是语法不同,需要特别注意。
create database <database-name> //创建数据库
show databases; //查询现在所有数据库
show default database; //查询默认数据库
:use <database-name> //选择使用一个数据库
stop database <db-name> //停止使用数据库
有可能报异常,创建数据库不成功 > 参考解决方案
> create 命令
/**
* <node-name> 我们要创建的节点的名称,它作为数据库存储的唯一标识存在,我们不
* 能用这个来访问节点信息
* <label-name> 这个是节点的标签名称
*/
//创建没有属性的节点.我们使用该名称
create (<node-name>:<label-name>)
来访问节点信息
//创建带有属性的节点
create(<node-name>:<label-name>{
//如果属性值是字符串的话,value要使用引号
<Property1-name>:<Propertyn1-value>,
<Property1-name>:<Propertyn1-value>
})
> match 命令
获取节点信息(节点、属性、与之有关系的节点的信息)
/**
* 切记不可以直接单独使用Match命令,否则会报语法错误,不许结合retuen或者update使用
*/
//返回 <label-name> 下的内容
Match(<node-name>:<label-name>) return <node-name>
//查询条件也可以添加具体的属性信息,例如下面的这句话。查询Dept下,deptno为10的节点
//信息
Match(dept:Dept{deptno:10})
//还可以结合where使用,当deptno = 10 时,返回该节点的节点信息
Match(dept:Dept) where dept.deptno = 10 return dept
> return 命令
- 返回节点信息,也可以返回节点的属性值
- 和match结合使用
- 多个返回值使用逗号间隔
关系基础
- 单向关系
- 双向关系
- 使用 -> 表示关系
> create relationship order
/**
* 1、create 命令可以为节点创建多个<label-name>
* eg:create(user:USER1:USER2:USER3)
*
* 2、注意点: -[]-> 前后节点名称都要使用()括住
* 下面这种关系,对a来说是外向关系,对于b点来说是传入关系
*
* 3、-[<relationship-name>:<relationship-label-name>]->
* 同样和节点的访问方式一样,只可以通过 relationship-label-name
* 来访问节点信息
*/
create(a:A{aname:"demo"})-[is:IS]->(b:B{bname:"demo2"}) //单向关系
create(a:A{aname:"demo"})<-[is:IS]->(b:B{bname:"demo2"}) //双向关系
> where 命令
过滤match以后的信息
普通语法
/**
* where命令后面的条件也可以使用布尔运算符组装复杂条件,
* 和平时写sql的判断条件一致,但是
*/
match(demo:DEMO) where <condition> RETURN demo
Neo4j CQL中的布尔运算符
Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。
No. | 布尔运算符 | 描述 |
---|---|---|
1 | AND | 它是一个支持AND操作的Neo4j CQL关键字。 |
2 | OR | 它是一个Neo4j CQL关键字来支持OR操作。 |
3 | NOT | 它是一个Neo4j CQL关键字支持NOT操作。 |
4 | XOR | 它是一个支持XOR操作的Neo4j CQL关键字。 |
Neo4j CQL中的比较运算符
Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。
No. | 布尔运算符 | 描述 |
---|---|---|
1. | = | 它是Neo4j CQL“等于”运算符。 |
2. | <> | 它是一个Neo4j CQL“不等于”运算符。 |
3. | < | 它是一个Neo4j CQL“小于”运算符。 |
4. | > | 它是一个Neo4j CQL“大于”运算符。 |
5. | <= | 它是一个Neo4j CQL“小于或等于”运算符。 |
6. | >= | 它是一个Neo4j CQL“大于或等于”运算符。 |
使用WHERE子句创建关系
/**
* 注意:where条件中创建关系的时候,使用的是node-label-name,不用node-name,否则命令执行完毕会出现两个空节点,如下图:
*/
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(a:A),(b:B) create (a)-[is:IS]->(b);
> delete 命令
- 不可以单独使用,要配合match命令,和return一样
- 永久删除数据库节点和相关的节点和关系
- 删除节点
//要删除的节点名称列表,使用(,)分隔
delete <node-name-list>
- 如果节点和其他 节点存在关联关系,需要先删除关系,在删除节点
-
删除节点和节点之间的关系
delete <node-name1>,<node-name2>,<relationship-name>
//具体应用
match(a:A)-[is:IS]->(b:B) delete a,b,is
> remove 命令
- 删除节点的属性
- 删除节点的标签名称 label-name
- 删除节点关系
- 和delete的区别在于该命令不可以删除节点,知识修改节点中的一部分
- 不可以单独使用
remove <property-name-list>
//实际应用
match(user:USER{deptno:10}) remove user.uname return user
//上面这句命令相当于sql是:
alter table user remove column uname
select * from user where deptno = 10
/**
*删除节点标签名,<label-name-list>是标签名称列表,
只不过实际要写成<node-name>:<label-name>,....形式
*/
remove <label-name-list>
> set 命令
- 和remove是一种类型的命令,只不过set命令用于添加属性和标签
> limit 命令
限制查询返回结果的条数
- 不可以单独使用
- 意思是显示number条结果,默认从顶部开始算起
/**
* 注意这个地方只有一个数字,他表示显示前几行。不要和sql混淆,作用类似.但是语法不同
* 表示的意思也有差别,sql的limit startNum,endNum 代表一个区间,可以自己设置。而图数据库的limit num 表示显示前几行
*/
limit <number>
> skip 命令
限制查询返回结果的条数
- 和limit的作用类似,表示的意思是显示跳过number行显示剩下的结果
- 可以通过 skip x limit y 设置,从x开始显示,显示y条,这就和sql的limit startNum,endNum一样了
> merge 命令
- 这个命令可以创建节点。该命令会先检查创建的节点在数据库中是否已经存在,如果已经存在,则不创建新的,否则才会创建新的节点。
merge(<node-name>:<label-name>{property-name:property-value})
> in 命令
和sql的in是一样的,只不过这里语法需要注意
in [ <Collection-of-values> ] //使用中括号
null值
创建节点的时候不对属性赋值,创建的节点的属性数据库使用NULL值来填充。
- 规避null
- 使用 where条件 is not null
Sorting排序
order by
- 默认升序排序(asc)
- 设置降序将其改为desc
- 和mysql的升序降序类似,但是要结合match命令,match-return命令就和sql中的select意思一样。
Union 合并
与sql一样,它也有两种形式:
- union 揉和两个结果集,公共部分(两个结果集都存在的结果)只显示一个结果集的
限制:
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
/**
* 下面这个命令会报错,因为cc.id和dc.id虽然数据类型是一样的而且也是相同的id列,
* 但是他们的前缀cc和dc不同,解决方式是使用as命令,起别名。
*/
MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
//解决方案
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
- union all 合并两个结果集,这个不会去重。最终结果会有重复。具体语法参照union
id属性 命令
id是节点和关系的默认内部属性,当我们创建一个新的节点的时候,neo4j将为内部使用分配一个数组。自动递增
函数
字符串相关
常用字符串函数列表
No | 功能 | 描述 |
---|---|---|
1 | UPPER | 它用于将所有字母更改为大写字母。 |
2 | LOWER | 它用于将所有字母改为小写字母。 |
3 | SUBSTRING | 它用于获取给定String的子字符串。 |
4 | REPLACE | 它用于替换一个字符串的子字符串。 |
聚合函数常用
聚合函数列表
No. | 聚集功能 | 描述 |
---|---|---|
1 | COUNT | 它返回由MATCH命令返回的行数。可以是* |
2 | MAX | 它从MATCH命令返回的一组行返回最大值。 |
3 | MIN | 它返回由MATCH命令返回的一组行的最小值。 |
4 | SUM | 它返回由MATCH命令返回的所有行的求和值。 |
5 | AVG | 它返回由MATCH命令返回的所有行的平均值。 |
关系函数
上两种函数和sql的类似,但是这个需要注意一下
- STARTNODE() 它用于知道关系的开始节点
match(a:A)-[is:IS]->(b:B) return startnode(is)
- ENDNODE() 输出关系的结束节点
- ID() 输出关系的id
- type()输出关系的类型信息,实操返回的是关系的label-name
索引
索引的作用和sql的一样,都是为例加快数据库查询性能
创建索引
//在节点或者关系名为<label-name>的<property-name>创建索引
create index no:<label-name> (property-name)
删除索引
//在节点或者关系名为<label-name>的<property-name>创建索引
drop index no:<label-name> (property-name)
唯一索引(unique)
//如果数据库中的节点或者关系属性有重复,则无法创建索引
create constraint on <label-name> assert <property-name> is unique
//删除索引
drop constraint on <label-name> assert <property-name> is unique