我遇到一种情况,我需要为一种类型的关系A
或另一种类型的关系B
匹配一个可变长度的路径。但是,关系类型A
是双向的,而关系类型B
是单向的。
例如如果两种关系类型都是双向的,则可以使用以下match语句:
MATCH (:Something {property: "value"}) -[:A|B*]- (n:Something)
但是由于关系类型B
是单向的,所以我需要这样的东西:
MATCH (:Something {property: "value"}) (-[:A]- OR <-[:B]-)* (n:Something)
我可以使用的一种解决方案是为所有A
作为INVERSE_A
创建反向关系类型,然后使用:
MATCH (:Something {property: "value"}) <-[:A|INVERSE_A|B*]- (n:Something)
但是接下来,我需要为每个INVERSE_A
关系创建A
,这将使该查询变得混乱。
是否有一种更清洁的方法将单向和双向关系合并到单个match语句中?
答案 0 :(得分:0)
目前,以这种方式限制密码。
如果您有权访问APOC Procedures,则可以使用path expander procs提供扩展关系,并能够分别为每种类型提供方向(或缺少方向)。此特定过程会产生路径,因此您需要获取路径的最后一个节点。
MATCH (start:Something {property: "value"})
CALL apoc.path.expand(start, 'A|<B', 'Something', 1, -1) YIELD path
// parameters are: (startNode, relationshipFilter, labelFilter, minLevel, maxLevel)
WITH last(nodes(path)) as n
...