Neo4j - Cypher

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. 创建节点

    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
  2. 创建关系

    1
    2
    3
    4
    MATCH (a:Person),(b:Person)
    WHERE a.name = 'Node A' AND b.name = 'Node B'
    CREATE (a)-[r:RELTYPE]->(b)
    RETURN r
  3. 创建关系并设置属性

    1
    2
    3
    4
    MATCH (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

  1. Use ON CREATE and ON MATCH

    1
    2
    3
    MERGE (keanu:Person { name:'Keanu Reeves' })
    ON CREATE SET keanu.created = timestamp()
    RETURN keanu.name, keanu.created
  2. Merge with ON CREATE and ON MATCH

    1
    2
    3
    4
    MERGE (keanu:Person { name:'Keanu Reeves' })
    ON CREATE SET keanu.created = timestamp()
    ON MATCH SET keanu.lastSeen = timestamp()
    RETURN keanu.name, keanu.created, keanu.lastSeen
  3. Merge relationships

    1
    2
    3
    MATCH (charlie:Person { name:'Charlie Sheen' }),(wallStreet:Movie { title:'Wall Street' })
    MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
    RETURN charlie.name, type(r), wallStreet.title
1
2
3
MATCH (oliver:Person { name:'Oliver Stone' }),(reiner:Person { name:'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie

查询

语法

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
14
MATCH (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
2
3
CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE

DROP CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE

索引

1
2
3
4
5
1. 创建索引
CREATE INDEX ON :Person(name)

2. 删除索引
DROP INDEX ON :Person(name)

参考:

neo4j官网Cypher文档