Neo4j是一种图数据库。它将结构化数据存储在图上而不是传统的数据库表中。 相对于关系数据库来说,图数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询。在关系数据库中, 这些查询会导致大量的表连接,因此会产生性能上的问题,但是使用Neo4j就可以解决查询时出现的性能衰退问题。 同时Neo4j还提供了非常快的图算法、推荐系统和OLAP风格的分析。下面主要简单记录一下Cypher查询语言的使用方法。
这个查询语言包含以下几个明显的部分:
- START:在图中的开始点,通过元素的ID或所以查找获得。
- MATCH:图形的匹配模式,束缚于开始点。
- WHERE:过滤条件。
- RETURN:返回所需要的。
Operators | |
---|---|
Mathematical | +, -, *, /, %, ^ |
Comparison | =, <>, <, >, <=, >= |
Boolean | AND, OR, XOR, NOT |
String | + |
Collection | +, IN, [x], [x .. y] |
Regular Expression | =~ |
String matching | STARTS WITH, ENDS WITH, CONTAINS |
Create
创建节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17-- 创建单节点
CREATE (n)
-- 创建多节点
CREATE (n),(m)
-- 创建一个节点并含有一个label
CREATE (n:Person)
-- 创建一个节点并含有多个label
CREATE (n:Person:Swedish)
-- 创建一个节点并含有label和properties
CREATE (n:Person { name : 'Andres', title : 'Developer' })
-- 创建一个节点并返回该节点
CREATE (a { name : 'Andres' }) RETURN a创建关系
1
2
3
4MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:RELTYPE]->(b)
RETURN r创建关系并设置属性
1
2
3
4MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:RELTYPE { name : a.name + '<->' + b.name }]->(b)
RETURN r
Merge
Use ON CREATE and ON MATCH
1
2
3MERGE (keanu:Person { name:'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.createdMerge with ON CREATE and ON MATCH
1
2
3
4MERGE (keanu:Person { name:'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeenMerge relationships
1
2
3MATCH (charlie:Person { name:'Charlie Sheen' }),(wallStreet:Movie { title:'Wall Street' })
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title
1 | MATCH (oliver:Person { name:'Oliver Stone' }),(reiner:Person { name:'Rob Reiner' }) |
查询
语法1
2
3
4[MATCH WHERE]
[OPTIONAL MATCH WHERE]
[WITH [ORDER BY] [SKIP] [LIMIT]]
RETURN [ORDER BY] [SKIP] [LIMIT]
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14MATCH (n:Person)-[:KNOWS]->(m:Person)WHERE n.name="Alice"
Node patterns can contain labels and properties.
MATCH (n)-->(m)
Any pattern can be used in MATCH.
MATCH (n {name:'Alice'})-->(m)
Patterns with node properties.
MATCH p = (n)-->(m)
Assign a path to p.
OPTIONAL MATCH (n)-[r]->(m)
Optional pattern, NULLs will be used for missing parts
唯一约束
1 | CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE |
索引
1 | 1. 创建索引 |