限制与注意事项

不支持的功能

不支持的存储过程

db.index.fulltext.awaitEventuallyConsistentIndexRefresh() 在 2025.12 和 2026.01 版本的共享属性数据库(sharded property databases)中不受支持。

强烈建议不要在共享属性数据库上使用 dbms.setConfigValue(),因为共享属性数据库运行在集群环境中,这意味着该存储过程必须在每个集群成员上分别运行,且不会自动同步到其他成员。

特别需要注意的是,dbms.setConfigValue() 不能用于设置只读行为,因为 server.databases.read_onlyserver.databases.writable 这两个设置与共享属性数据库不兼容。设置读/写访问权限的正确方法是使用 ALTER DATABASE。详细信息请参阅 更改共享属性数据库

基于属性的访问控制 (PBAC)

此版本不支持 PBAC。

性能注意事项

包含 MERGE 子句的查询

在任何有意义的规模下,MERGE 查询的速度都非常慢。由于其执行计划,它们很可能导致嵌套循环连接,这在目前的共享属性数据库中表现不佳。

对路径中的属性进行过滤

那些在遍历下一个关系属性之前,需要检查两个节点间所有关系属性的查询可能会遇到性能问题。例如,以下查询必须获取人与人之间的每一个 [k:KNOWS] 关系,以检查其每个属性,然后才能遍历到下一个人。

MATCH (n:Person)[k:KNOWS*1..]>(m:Person)
WHERE k.creationDate=1268465841718
RETURN n,k,m

这可以改写为以下性能更好的形式:

MATCH (n:Person)[k:KNOWS{creationDate=1268465841718}]>+(m:Person)
RETURN n,k,m

但是,并非所有查询都可以这样改写。

用于批量写操作的事务调用 (Call in transactions)

由于写入架构的原因,在写操作期间对大事务进行批处理可以带来显著的性能优势。对于单实例数据库也是如此,但在共享属性数据库中,这种性能差异更为明显。

例如,考虑以下查询:

node_updates = [
    { id: 1, name: "Alice", age: 30 },
    { id: 2, name: "Bob", age: 25 },
    { id: 3, name: "Charlie", age: 40 }
]

FOR each update IN node_updates DO
    EXECUTE Cypher:
        MATCH (n:Person {id: update.id})
        SET n.name = update.name,
            n.age = update.age
END FOR

可以改写为以下形式以获得更好的性能:

WITH [
    {id: 1, name: "Alice", age: 30},
    {id: 2, name: "Bob", age: 25},
    {id: 3, name: "Charlie", age: 40}
] AS updates

UNWIND updates AS u
MATCH (n:Person {id: u.id})
SET n.name = u.name,
    n.age = u.age

其他注意事项

neo4j-admin database copy 到共享属性数据库

当使用 neo4j-admin database copy --property-shard-count > 0 命令将现有数据库拆分为分片时,无法进行原位复制,这意味着你不能用共享属性数据库替换现有的数据库。相反,你必须指定一个新名称,或将 --to-path-data--to-path-txn,或者 --target-location={path|uri}--target-format={database|backup} 设置为一个新的 DBMS 位置。

在共享数据库中使用 USE 子句

USE 子句中定位共享数据库时,请在图引用中使用其虚拟数据库名称或别名。不支持直接定位分片。

例如:

USE `neo4j-sharded` MATCH (n) RETURN n

Cypher 5

共享属性数据库不支持 Cypher 5。尽管某些查询可能有效,但它并未得到官方支持。你必须使用 Cypher25,这是创建共享属性数据库时的默认版本。请参阅 配置 Cypher 默认版本