Neo4j CQL - UNIQUE约束

在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。

根据我们对某些节点或关系的应用需求,我们必须避免这种重复。

然后我们不能直接得到这个。

我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。

像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束

UNIQUE约束的优点

避免重复记录。 强制执行数据完整性规则。

Neo4j CQL UNIQUE约束操作

创建UNIQUE约束 丢弃UNIQUE约束。 我们将在本章中用示例讨论创建UNIQUE约束操作。

创建UNIQUE约束

Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。

语法

CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE

实战

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

会报错:

Invalid constraint syntax, ON and ASSERT should not be used. Replace ON with FOR and ASSERT with REQUIRE. (line 1, column 1 (offset: 0))
"CREATE CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE;"
 ^

在Neo4j 4.0版本及以上,唯一约束的语法已经发生了变化。

新的语法中,ON关键字被替换为FORASSERT被替换为REQUIRE

因此,创建唯一约束的Cypher语句应该使用新的语法。

以下是使用新语法创建唯一约束的示例:

CREATE CONSTRAINT FOR (p:Person) REQUIRE p.id IS UNIQUE;

在这个语法中,我们使用CREATE CONSTRAINT关键字,后面紧跟FOR (p:Person)指定了该约束应用于Person节点。REQUIRE p.id IS UNIQUE指定了id属性的唯一性约束。

请注意,如果你的Neo4j数据库版本低于4.0,那么你应该继续使用ONASSERT关键字的语法。

删除UNIQUE约束

Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。

删除UNIQUE约束语法:

DROP CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUE

实战

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

报错:

Neo.ClientError.Statement.SyntaxError
Uniqueness constraints cannot be dropped by schema, please drop by name instead: DROP CONSTRAINT constraint_name. The constraint name can be found using SHOW CONSTRAINTS. (line 1, column 1 (offset: 0))
"DROP CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE;"
 ^

按照提示,我们首先查看索引

SHOW CONSTRAINTS

输出结果:

╒═══╤═════════════════════╤════════════╤══════════╤═════════════╤══════════╤═════════════════════╤════════════╕
id name                 type        entityTypelabelsOrTypespropertiesownedIndex           propertyType
╞═══╪═════════════════════╪════════════╪══════════╪═════════════╪══════════╪═════════════════════╪════════════╡
5  "constraint_59c89b17""UNIQUENESS""NODE"    ["Person"]   ["id"]    "constraint_59c89b17"null        
└───┴─────────────────────┴────────────┴──────────┴─────────────┴──────────┴─────────────────────┴────────────┘

根据名称删除:

DROP CONSTRAINT constraint_59c89b17

删除成功,可以通过显示索引验证。

小结

neo4j 的版本也非常重要。所以有些知识具有一定的滞后性,需要实践出真知。

Q1-neo4j 如何给关系的属性添加索引

在Neo4j图数据库中,可以给关系的属性添加索引,以便快速检索和查询。要给关系的属性添加索引,你可以按照以下步骤进行操作:

1. 创建索引

首先,你需要创建一个关系属性的索引。你可以使用以下的Cypher查询语句来创建一个关系属性的索引:

CREATE INDEX ON :RelationshipType(propertyKey);

在上述查询中,RelationshipType 是关系的类型,propertyKey 是你想要添加索引的属性。

2. 查看索引

如果你想查看已经存在的索引,可以使用以下的Cypher查询:

:schema

这个命令会显示所有的索引,包括节点和关系的索引。

3. 使用索引进行查询

一旦你创建了索引,Neo4j会在查询时使用它来加速检索。你可以在Cypher查询中使用关系属性的索引来执行快速查询。例如:

MATCH (startNode)-[r:RelationshipType]->(endNode)
WHERE r.propertyKey = value
RETURN startNode, r, endNode;

在上述查询中,RelationshipType 是关系的类型,propertyKey 是你添加索引的属性,value 是你想要查询的属性值。

请注意,索引的性能取决于数据的分布和查询的复杂性。合适地使用索引可以显著提高查询性能,但是过度使用索引可能会导致性能下降。在设计和使用索引时,请根据具体的需求和数据特点进行权衡和优化。

Q2-上面的报错

报错 Invalid create index syntax, use `CREATE INDEX FOR ...` instead. (line 1, column 1 (offset: 0))
"create index on :METHOD_CALLS(id)"
 ^

在Neo4j 4.0 版本之后,创建索引的语法发生了变化。在新版本中,你需要使用 CREATE INDEX FOR 语法来创建索引。以下是正确的创建索引的方法:

CREATE INDEX FOR (n:METHOD_CALLS) ON (n.id);

在上述查询中,METHOD_CALLS 是节点的标签,id 是你想要添加索引的属性。这个查询会在 METHOD_CALLS 节点的 id 属性上创建索引。

请确保你的Neo4j数据库版本符合这个语法要求。

如果你的版本较旧,可能需要考虑升级到支持新语法的版本。

实测成功。

match p=(startM)-[r:METHOD_CALLS]->(endM) 
where (r.id = 't-perf-13-747') 
return r

Q3-如何查看 neo4j 的版本?

要查看Neo4j数据库的版本,你可以使用Neo4j的命令行工具或者在Neo4j的浏览器中执行Cypher查询来获取版本信息。

使用Neo4j的命令行工具:

如果你使用的是Neo4j的命令行工具(例如在Unix/Linux系统上的终端或者Windows系统上的命令提示符),可以使用以下命令来获取Neo4j的版本信息:

neo4j --version

这个命令会显示Neo4j的版本号以及其他相关信息。

使用Neo4j的浏览器:

  1. 打开Neo4j的浏览器界面。
  2. 在浏览器中,点击右上角的设置按钮(齿轮图标)。
  3. 在弹出的菜单中,选择”System Information”(系统信息)。
  4. 在系统信息页面中,你可以看到Neo4j数据库的版本信息。

请注意,确保你有适当的权限来执行这些操作,特别是在生产环境中进行系统信息的查看。

neo4j 索引的实战

唯一约束

在Neo4j中添加唯一约束可以通过Cypher语句或Neo4j的管理界面(Neo4j Browser)完成。

以下是使用Cypher语句添加唯一约束的示例:

CREATE CONSTRAINT ON (n:LabelName) ASSERT n.propertyName IS UNIQUE;

其中,LabelName 是节点的标签名,propertyName 是要设置唯一约束的属性名。

举个例子,如果你有一个名为Person的标签,你希望email属性是唯一的,可以这样写:

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

如果该属性包含null值,添加唯一约束会失败。如果存在重复值,添加唯一约束也会失败。

要删除唯一约束,可以使用类似的语法,只需将CREATE替换为DROP

DROP CONSTRAINT ON (n:LabelName) ASSERT n.propertyName IS UNIQUE;

以上操作将添加或删除节点属性的唯一约束。

如果需要对关系的属性设置唯一约束,语法类似,只需将CREATE CONSTRAINT ONDROP CONSTRAINT ON中的节点标签和属性替换为关系类型和关系属性。

查看所有的约束

要查看所有已经存在的约束(包括唯一约束),你可以使用以下的 Cypher 查询:

CALL db.constraints;

这个查询将返回一个结果集,其中包含了所有已存在的约束信息。

这些信息包括约束的类型(例如:UNIQUENESS,EXISTENCE),以及约束所作用的节点标签或关系类型、属性等相关信息。

你也可以在 Neo4j Browser 中执行这个查询,或者通过 Neo4j 的 Java 驱动程序等方式在应用程序中执行。

index 的查看和管理

在Neo4j中,可以通过Cypher语句或者Neo4j的管理界面(Neo4j Browser)来指定创建索引。

以下是使用Cypher语句创建索引的示例:

CREATE INDEX ON :LabelName(propertyName);

其中,LabelName 是节点的标签名,propertyName 是要创建索引的属性名。

举个例子,如果你有一个名为Person的标签,你希望email属性创建索引,可以这样写:

CREATE INDEX ON :Person(email);

要删除索引,可以使用类似的语法,只需将CREATE替换为DROP

DROP INDEX ON :LabelName(propertyName);

同样,可以在Neo4j Browser中执行这些命令,或者通过Neo4j的Java驱动程序等方式在应用程序中执行。

如何查看所有的索引

要查看所有已经存在的索引,你可以使用以下的 Cypher 查询:

CALL db.indexes();

这个查询将返回一个结果集,其中包含了所有已存在的索引信息。这些信息包括索引的名称、类型、所作用的节点标签或关系类型、属性等相关信息。

你也可以在 Neo4j Browser 中执行这个查询,或者通过 Neo4j 的 Java 驱动程序等方式在应用程序中执行。

数据测试的一个教训

测试的时候,保持索引+约束的干净。

参考资料

https://www.w3cschool.cn/neo4j/neo4j_cql_relationship_basics.html

https://www.w3cschool.cn/neo4j/neo4j_directional_relationships.html

https://www.w3cschool.cn/neo4j/neo4j_create_unique_constraint.html

https://www.w3cschool.cn/neo4j/neo4j_drop_unique_constraint.html