码迷,mamicode.com
首页 > 其他好文 > 详细

Cypher索引、约束

时间:2020-07-22 20:07:17      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:企业版   like   标签   删除数据库   title   mic   高级   一个   load   

索引

创建索引

  • 使用CREATE INDEX ON可以在拥有某个标签的所有节点的某个属性上创建索引。

  • 需要注意的是,索引是在后台创建的,并不能立刻就生效。

  • 示例:为含有":Person"标签和name属性的所有节点创建了索引

CREATE INDEX ON :Person(name)

删除索引

  • 使用DROP INDEX ON可以删除拥有某个标签的所有节点的某个属性上的索引。

  • 示例:删除有":Person"标签和name属性的所有节点上的索引

DROP INDEX ON :Person(name)

使用索引

  • 通常不需要在查询中指定使用哪个索引,Cypher会自己决定。

  • 示例:

MATCH (person :Person{name:"Andres"}) 
RETURN person

在WHERE等式中使用索引

  • 在WHERE语句中对索引的属性进行相等比较的时候,索引将自动被使用。

  • 示例:

MATCH (person:Person)
WHERE person.name = ‘Andres‘
RETURN person     

在WHERE不等式中使用索引

  • 在WHERE语句中对索引的属性进行不等(范围)比较的时候,索引将被自动使用。

  • 示例:

MATCH (person:Person)
WHERE person.name = ‘Andres‘
RETURN person     

在IN中使用索引

  • 在WHERE语句中对索引的属性使用IN进行范围查询,索引将被自动使用。

  • 示例:

MATCH (person:Person)
WHERE person.name IN [‘Andres‘, ‘Mark‘]
RETURN person                      

在STARTS WITH中使用索引

  • 在WHERE语句中对索引的属性使用IN进行STARTS WITH判断,索引将被自动使用。

  • 示例:

MATCH (person:Person)
WHERE person.name STARTS WITH ‘And‘
RETURN person    

在exists中使用索引

  • 在WHERE语句中对索引的属性使用exists判断,索引将被自动使用。

  • 示例:

MATCH (person:Person)
WHERE exists(person.name)
RETURN person    

约束

概述

  • Neo4j通过使用约束来保证数据的完整性。约束可以应用于节点或关系。可以创建节点属性的唯一性约束,也可以创建节点和关系的属性存在性约束。
  • 可以使用属性的存在性约束来确保拥有特定标签的所有节点或者拥有特定类型的所有关系的属性是存在的。注意:只有Neo4j的企业版才具有属性存在性约束这个高级功能。
  • 可以对某个给定的标签添加多个约束,也可以将唯一性约束和存在性约束同时添加到同一个属性上。
  • 在属性上添加唯一性约束的同时也会自动为该属性添加一个索引。

节点属性唯一性约束

创建节点属性唯一性约束

  • 使用IS UNIQUE语法创建约束,它能确保数据库中拥有特定标签和属性值的节点是唯一的。

  • 示例:

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

删除节点属性唯一性约束

  • 使用DROP CONSTRAINT可以删除数据库中的一个约束。

  • 示例:

DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQU

应用示例

  • 示例:创建一个数据库中还不存在的isbn的Book节点
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
  • 示例:创建一个数据库中已经存在的isbn的Book节点
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })

技术图片

  • 示例:当数据库中已经有两个Book节点拥有相同的isbn属性的时候,在Book节点上创建isbn属性创建属性唯一性约束。
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE

技术图片

  • 解决方案:上述情况下约束创建失败,因为它和已有的数据冲突。可以移除冲突的节点再重新创建约束。

节点属性存在性约束

创建节点属性存在性约束

  • 使用ASSERT exists(variable.propertyName)创建约束,可确保有指定标签的所有节点都有一个特定的属性。

  • 示例:

CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)

删除节点属性存在性节点

  • 使用DROP CONSTRAINT从数据库中移除一个约束。

  • 示例:

DROP CONSTRAINT ON (book:Book) ASSERT exists(book.isbn) 

应用示例

  • 示例:创建一个存在isbn属性的Book节点
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ }) 
  • 示例:在:Book(isbn)有存在性约束的情况下,试图创建一个没有isbn属性的Book节点
CREATE (book:Book { title: ‘Graph Databases‘ }) 

技术图片

  • 示例:在:Book(isbn)有存在性约束的情况下,试图从一个已存在的Book节点移除isbn属性
MATCH (book:Book { title: ‘Graph Databases‘ })
REMOVE book.isbn 

技术图片

  • 示例:当数据库中存在Book节点没有isbn属性时,试图在Book标签节点的isbn属性上创建属性存在性约束
DROP CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)
CREATE (book:Book { title: ‘Graph Databases‘ })
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn) 

技术图片

关系属性存在性约束

创建关系属性存在性约束

  • 使用ASSERT exists(variable.propertyName)创建约束,可确保特定类型的所有关系都有一个特定的属性。

  • 示例:

CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

删除关系属性存在性约束

  • 使用DROP CONSTRAINT从数据库中移除一个约束。

  • 示例:

DROP CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

应用示例

  • 示例:创建一个存在day属性的LIKED关系
MATCH (TomH:Person {name:‘Tom Hanks‘, born:1956}), (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (TomH)-[like:LIKED { day: ‘yesterday‘ }]->(book)
RETURN TomH,book 
  • 示例:在有:LIKED(day)存在性约束的情况下,试图创建一个没有day属性的LIKED关系
MATCH (Nora :Person {name:‘Nora Ephron‘}), (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (Nora)-[like:LIKED]->(book)
return Nora,book

技术图片

  • 示例:有:LIKED(day)存在性约束的情况下,试图从一个已有LIKED关系中移除day属性
MATCH (TomH :Person {name:‘Tom Hanks‘})-[like:LIKED]-> (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
REMOVE like.day

技术图片

  • 示例:当数据库中存在LIKED关系没有day属性时,试图在LIKED关系的day属性上创建属性存在性约束
DROP CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)
MATCH (TomH:Person {name:‘Tom Hanks‘, born:1956}), (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (TomH)-[like:LIKED]->(book)
RETURN TomH,book 
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

技术图片

Cypher索引、约束

标签:企业版   like   标签   删除数据库   title   mic   高级   一个   load   

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/13362077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!