根据If Else条件收集修饰节点

vkc1a9a2  于 2022-10-01  发布在  其他
关注(0)|答案(1)|浏览(127)

假设我有以下图表:

(r1:R)  (r11:R)
                      |     /
                    (p1:P)
                       |
(a1:A) -> (b1:B) -> (c1:C) -> (d1:D)
                               |
     - -> (x1:X) -> (y1:Y) -> (c11:C)
            |                    |
          (p11:P)             (p111:P)
            |                    |
          (r111:R)            (r1111:R)

                    (r2:R)
                      |
                    (p2:P)
                      |
(a2:A) -> (b2:B) -> (c2:C) -> (d2:D)

(a3:A) -> (x3:X) -> (y3:Y) -> (c3:C) -> (d3:D)
            |                   |
          (p3:P)              (p33:P)
            |                   |
          (r3:R)              (r33:R)

我可以使用这个查询来获取基于特定规则的路径,并将基于D节点属性名称的路径合并到子图中

MATCH (a:A), (d:D)
OPTIONAL MATCH p1=((a)-->(:B)-->(:C)-->(d))
OPTIONAL MATCH p2=((a)-->(:X)-->(:Y)-->(:C)-->(d))

WITH d.name AS dName,
       apoc.coll.toSet(
            apoc.coll.flatten(
                 COLLECT(COALESCE(nodes(p1),[]) + COALESCE(nodes(p2),[]))
            )
       ) AS nodes,
apoc.coll.toSet(
            apoc.coll.flatten(
                 COLLECT(COALESCE(relationships(p1),[]) + COALESCE(relationships(p2),[]))
            )
       ) AS relationships
WHERE nodes <> []
WITH nodes, relationships,
     [src IN nodes WHERE src:X OR src:C |
              {
                SRC: src,
                P: HEAD([(src)--(p:P) | p]),
                R: [(src)--(p:P)--(r:R) | r]
              }
     ] AS srcs

RETURN nodes, relationships, srcs

请注意,对于C和X节点,它们是修饰节点P和R。始终有一个P节点修饰C节点和一个P节点修饰X节点。可以有至少一个R节点装饰P个节点。

有一件非常重要的事情:当路径既包含X节点又包含C节点时,上面的查询将从节点X和C收集P和R节点。但是,当路径包含X节点时,我只想获得装饰X节点的P节点和R节点,而不是C节点。

我应该如何修改查询?

9o685dep

9o685dep1#

要处理这种情况,您只需将查询的后半部分更改为

WITH nodes, relationships,
     CASE WHEN ANY(node IN nodes WHERE node:X) THEN
           [src IN nodes WHERE src:X  |
                    {
                      SRC: src,
                      P: HEAD([(src)--(p:P) | p]),
                      R: [(src)--(p:P)--(r:R) | r]
                    }
           ] 
        ELSE        
           [src IN nodes WHERE src:X OR src:C |
                    {
                      SRC: src,
                      P: HEAD([(src)--(p:P) | p]),
                      R: [(src)--(p:P)--(r:R) | r]
                    }
           ] 
      END AS srcs

相关问题