如何用Neo4j Cypher进行数据查询与总结?

2026-05-26 17:562阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1149个文字,预计阅读时间需要5分钟。

如何用Neo4j Cypher进行数据查询与总结?

CQL是Cypher查询语言的简称。在Neo4j浏览器(浏览器)中输入命令时,若需要回车,使用Shift+Enter进行输入。在Cypher中,单引号和双引号都可以用来表示字符串(这与Python类似)。


  CQL代表Cypher查询语言。

  在Neo4j-browser(浏览器)中输入命令时,如果需要回车,使用Shift+Enter进行输入。

  在Cypher中单引号和双引号都可以表示字符串(这点和Python相同)。

1. MATCH

1.1 MATCH语法

MATCH相当于SQL SELECT

MATCH
(node)-[relationship]->(node)
WHERE
(node | relationship)
RETURN
(node | relationship)

1.2 MATCH语句实例

例一:

MATCH (n:Person)
RETURN n limit 1000

其中n是别名,相当于SQL中的AS。

例二,带有关系的查询:

如何用Neo4j Cypher进行数据查询与总结?

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
RETURN n,p limit 10

例三,限制条件下带有关系的查询:

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
WHERE n.name = "姓名6"
RETURN n,p limit 10

1.3 多维度关系查询

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)-[:CALL]->(p1:Phone)
WHERE n.name = "姓名6"
RETURN n,p,p1 limit 10

1.4 不限制实体的关系查询

MATCH p=()-[c:CALL]-()
RETURN p limit 10MATCH p=()-[c:CALL]->()
RETURN p limit 10

如果不加limit 10,两者结果是相同的。

1.5 带有正则表达式的查询

MATCH (n:USERS)
WHERE n.name=~'Jack.*'
RETURN n

1.6 包含查询

MATCH (n:USERS)
WHERE n.name contains ‘J’
RETURN n

2. CREATE

  创建实体和关系。

2.1 CREATE语句实例

例一:

CREATE (n:Person)-[:LOVES]->(m:Dog)

例二,带有属性的创建:

CREATE (n:Person{name:"李四"})-[:FEARS{level:1}]->(t:Tiger{type:"东北虎"})

2.2 给没有关系的实体创建关系

  • 创建实体
  • CREATE (n:Person{name:'王五'})
    CREATE (n:Person{name:'赵六'})
  • 创建关系,具体内容为创建一个关系k,使得name=“王五”的Person与name:"赵六"的Person有KNOW的关系
  • MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    CREATE (n)-[k:KNOW]->(m)
    RETURN k
  • 查询验证(此步可有可无)
  • MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    RETURN n,m

    3. MERGE

    MERGE和CREATE的操作比较类似,区别在于哪里呢?为了便于理解,我们以Python的例子为例,假设数据存放在list中,CREATE相当于直接append,而MERGE相当于先find,如果存在则pass,如果不存在则CREATE。

    MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    CREATE (n)-[l:LOVE]->(m)
    RETURN lMATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    RETURN n,m

    4. DELETE

    4.1 删除实体之间的关系

    MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
    DELETE f

    4.2 删除实体

    MATCH (n:Person{name:'李四'})
    DELETE n

    4.3 同时删除实体和关系

    MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
    DELETE n,f,t

    5. SET

    向现有节点或关系添加新标签或者属性。

    5.1 添加实体标签

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t:A

    这时候会对该实体添加一个实体标签A。

    5.2 修改、更新实体的属性

    修改属性

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t.type='老虎'

    添加属性

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t.name='阿虎'

    6. 索引

    6.1 添加索引

    语法为:CREATE INDEX ON :<label_name> (<property_name>)

    CREATE INDEX ON:Person(name)

    6.2 删除索引

    语法为:DROP INDEX ON :<label_name> (<property_name>)

    DROP INDEX ON:Person(name)

    6.3 添加唯一索引

    语法为:CREATE CONSTRAINT ON (<label_name>)

    ASSERT <property_name> IS UNIQUE

    CREATE CONSTRAINT ON (p:Person)
    ASSERT p.number IS UNIQUE

    6.4 删除唯一索引

    语法为:DROP CONSTRAINT ON (<label_name>)

    ASSERT <property_name> IS UNIQUE

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

    7. 复杂查询

    姓名12的三度关系内的朋友有哪些

    MATCH (p1:Person)-[:FRIEND_OF]-(p2:Person)-[:FRIEND_OF]-(p3:Person)
    WHERE p1.name='姓名12'
    RETURN p1,p2,p3

    姓名12的三度关系内的人有哪些

    MATCH (p1:Person)-[]-(p2:Person)-[]-(p3:Person)
    WHERE p1.name='姓名12'
    RETURN p1,p2,p3

    姓名11的通话记录中的电话有哪些

    MATCH (n:Person)-[:HAS_PHONE]->(p1:Phone)-[:CALL]-(p2:Phone)
    WHERE n.name='姓名11'
    RETURN n,p1,p2

    8. 最短路径查询

    得到最短路径中的一个:

    MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
    p=SHORTESTPATH((p1)-[*..10]-(p2))
    RETURN p

    这里[*…10]表示路径深度10以内查找所有存在的关系中的最短路径关系。

    得到所有最短路径:

    MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
    p=ALLSHORTESTPATHS((p1)-[*..10]-(p2))
    RETURN p




    本文共计1149个文字,预计阅读时间需要5分钟。

    如何用Neo4j Cypher进行数据查询与总结?

    CQL是Cypher查询语言的简称。在Neo4j浏览器(浏览器)中输入命令时,若需要回车,使用Shift+Enter进行输入。在Cypher中,单引号和双引号都可以用来表示字符串(这与Python类似)。


      CQL代表Cypher查询语言。

      在Neo4j-browser(浏览器)中输入命令时,如果需要回车,使用Shift+Enter进行输入。

      在Cypher中单引号和双引号都可以表示字符串(这点和Python相同)。

    1. MATCH

    1.1 MATCH语法

    MATCH相当于SQL SELECT

    MATCH
    (node)-[relationship]->(node)
    WHERE
    (node | relationship)
    RETURN
    (node | relationship)

    1.2 MATCH语句实例

    例一:

    MATCH (n:Person)
    RETURN n limit 1000

    其中n是别名,相当于SQL中的AS。

    例二,带有关系的查询:

    如何用Neo4j Cypher进行数据查询与总结?

    MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
    RETURN n,p limit 10

    例三,限制条件下带有关系的查询:

    MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
    WHERE n.name = "姓名6"
    RETURN n,p limit 10

    1.3 多维度关系查询

    MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)-[:CALL]->(p1:Phone)
    WHERE n.name = "姓名6"
    RETURN n,p,p1 limit 10

    1.4 不限制实体的关系查询

    MATCH p=()-[c:CALL]-()
    RETURN p limit 10MATCH p=()-[c:CALL]->()
    RETURN p limit 10

    如果不加limit 10,两者结果是相同的。

    1.5 带有正则表达式的查询

    MATCH (n:USERS)
    WHERE n.name=~'Jack.*'
    RETURN n

    1.6 包含查询

    MATCH (n:USERS)
    WHERE n.name contains ‘J’
    RETURN n

    2. CREATE

      创建实体和关系。

    2.1 CREATE语句实例

    例一:

    CREATE (n:Person)-[:LOVES]->(m:Dog)

    例二,带有属性的创建:

    CREATE (n:Person{name:"李四"})-[:FEARS{level:1}]->(t:Tiger{type:"东北虎"})

    2.2 给没有关系的实体创建关系

  • 创建实体
  • CREATE (n:Person{name:'王五'})
    CREATE (n:Person{name:'赵六'})
  • 创建关系,具体内容为创建一个关系k,使得name=“王五”的Person与name:"赵六"的Person有KNOW的关系
  • MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    CREATE (n)-[k:KNOW]->(m)
    RETURN k
  • 查询验证(此步可有可无)
  • MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    RETURN n,m

    3. MERGE

    MERGE和CREATE的操作比较类似,区别在于哪里呢?为了便于理解,我们以Python的例子为例,假设数据存放在list中,CREATE相当于直接append,而MERGE相当于先find,如果存在则pass,如果不存在则CREATE。

    MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    CREATE (n)-[l:LOVE]->(m)
    RETURN lMATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
    RETURN n,m

    4. DELETE

    4.1 删除实体之间的关系

    MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
    DELETE f

    4.2 删除实体

    MATCH (n:Person{name:'李四'})
    DELETE n

    4.3 同时删除实体和关系

    MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
    DELETE n,f,t

    5. SET

    向现有节点或关系添加新标签或者属性。

    5.1 添加实体标签

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t:A

    这时候会对该实体添加一个实体标签A。

    5.2 修改、更新实体的属性

    修改属性

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t.type='老虎'

    添加属性

    MATCH (t:Tiger)
    WHERE ID(t)=1637
    SET t.name='阿虎'

    6. 索引

    6.1 添加索引

    语法为:CREATE INDEX ON :<label_name> (<property_name>)

    CREATE INDEX ON:Person(name)

    6.2 删除索引

    语法为:DROP INDEX ON :<label_name> (<property_name>)

    DROP INDEX ON:Person(name)

    6.3 添加唯一索引

    语法为:CREATE CONSTRAINT ON (<label_name>)

    ASSERT <property_name> IS UNIQUE

    CREATE CONSTRAINT ON (p:Person)
    ASSERT p.number IS UNIQUE

    6.4 删除唯一索引

    语法为:DROP CONSTRAINT ON (<label_name>)

    ASSERT <property_name> IS UNIQUE

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

    7. 复杂查询

    姓名12的三度关系内的朋友有哪些

    MATCH (p1:Person)-[:FRIEND_OF]-(p2:Person)-[:FRIEND_OF]-(p3:Person)
    WHERE p1.name='姓名12'
    RETURN p1,p2,p3

    姓名12的三度关系内的人有哪些

    MATCH (p1:Person)-[]-(p2:Person)-[]-(p3:Person)
    WHERE p1.name='姓名12'
    RETURN p1,p2,p3

    姓名11的通话记录中的电话有哪些

    MATCH (n:Person)-[:HAS_PHONE]->(p1:Phone)-[:CALL]-(p2:Phone)
    WHERE n.name='姓名11'
    RETURN n,p1,p2

    8. 最短路径查询

    得到最短路径中的一个:

    MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
    p=SHORTESTPATH((p1)-[*..10]-(p2))
    RETURN p

    这里[*…10]表示路径深度10以内查找所有存在的关系中的最短路径关系。

    得到所有最短路径:

    MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
    p=ALLSHORTESTPATHS((p1)-[*..10]-(p2))
    RETURN p