关于openCypher是否支持类正则复杂路径模式查询的技术问询
openCypher的路径模式语法不支持你提出的这类类正则的复杂路径约束,它的路径模式能力相对有限,以下针对你的每个示例逐一说明:
交替关系路径(Follows-Likes-Follows-Likes...)
你预期的(Follows·Likes)*写法并不被支持,openCypher仅支持(Follows|Likes)*这类任意顺序的关系交替,无法强制要求两种关系严格交替出现。你预期的写法:
MATCH path = (startUser:User {name: 'Adam'})-[:(Follows·Likes)*]->(endUser:User) RETURN path实际openCypher中只能实现任意交替的关系匹配,无法满足严格交替的路径要求。
节点间多关系路径(Follows&Likes-Follows&Likes...)
合取操作(&)确实不被openCypher支持,你无法指定路径的每一步必须同时存在这两个关系。openCypher的关系模式仅支持“或”逻辑的关系集合,无法强制多关系的合取约束。你预期的写法:
MATCH path = (startUser:User {name: 'Adam'})-[:(Follows&Likes)*]->(endUser:User) RETURN path这种合取式的路径模式在标准openCypher中没有对应的实现方式。
混合关系且某关系有次数限制的路径
openCypher不支持对单个关系类型单独设置次数限制的混合模式(如Follows*|Likes*5)。你只能对整个关系集合设置统一的次数范围,比如(Follows|Likes)*1..5,但无法分别控制不同关系的出现次数。你预期的写法:
MATCH path = (startUser:User {name: 'Adam'})-[:Follows*|Likes*5]->(endUser:User) RETURN path这类分关系设置次数的语法完全不被支持。
混合关系且某关系有位置限制的路径
openCypher无法指定路径的结尾必须是特定次数的某类关系(如Follows*·Likes*5),它的路径模式只能定义任意长度、任意顺序的关系集合,无法对路径的结构(如开头/结尾的关系类型、顺序)做精细化约束。你预期的写法:
MATCH path = (startUser:User {name: 'Adam'})-[:Follows*·Likes*5]->(endUser:User) RETURN path这种位置约束的路径模式同样不在标准openCypher的语法支持范围内。
针对你提出的疑问:是的,openCypher目前的路径查询能力确实无法支持这类复杂的类正则表达式式约束。它仅能支持:
- 单一关系的任意/指定次数匹配(如
Follows*、Follows*2..4) - 多关系的任意顺序匹配(如
(Follows|Knows)*)
无法实现对多关系路径的顺序控制、次数分别限制、合取约束或位置约束这类复杂逻辑。如果需要实现这类需求,通常需要在查询后通过应用层逻辑过滤,或者使用部分图数据库扩展的自定义语法(但这不属于标准openCypher范畴)。
内容的提问来源于stack exchange,提问作者Ohrwurm

