前段时间做了数据血缘项目,其中存储选择了图数据库neo4j。选择图数据库主要是看中图数据库在处理复杂的关系数据比关系型数据库更擅长,查询效率也会更高。选择neo4j主要是neo4j管理方面比较简单,上手也相对容易,且有一个比较友好的查询工具。
neo4j中相关的概念
节点(Node) 对应图概念中的点
关系(Relation) 就是图概念中的边
属性 相当于关系型数据库中的列,k-v形式
路径 图中从一个点到另一个点经过的点和边
语法
neo4j使用了cypher语法
一般查询
MATCH (node1:Label1)-[edge:RELATIONSHIP]-(node2:Label2)
WHERE <condition>
RETURN <expression>
- Label1/ Label2表示节点的标签
- node1和node2是节点变量,可以用来引用节点的属性信息
- RELATIONSHIP表示边的类型
- edge是边变量,可以用来引用边的属性信息
- 是可选的查询条件,可以用来筛选满足条件的节点和边
- 是要返回的属性信息
在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过条件语句来筛选符合条件的节点和边。最后,通过RETURN语句返回查询结果中的属性信息。
节点查询
match (n:User)
where n.userType='xxx' and n.userName='xxx'
return n limit 100;
聚合
MATCH (n:User) WHERE n.userType='xxx' RETURN COUNT(n);
关系查询
match p=()-[]->() return p limit 100;
// 返回路径
match p=(a)-[]->(n:User)
where n.name='xx' and n.userType='xx'
return p limit 300;
//返回节点或属性
match p=(a)-[]->(n:User)
where n.name='xx' and n.userType='xx'
return a limit 300;
match p=(a)-[]->(n:User)
where n.name='xx' and n.userType='xx'
return a.userType,a.name,a.age limit 300;
二度关系
MATCH p=()-[]->()-[]->() RETURN p LIMIT 100;
或
MATCH p=()-[*2..2]->() RETURN p LIMIT 100;
所有关系
match p=()-[*..]->() return p limit 100;