从复杂的子图关系中获取不同的装饰节点

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

假设我有以下图表:

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

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

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

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

MATCH (a:A), (d:D)
OPTIONAL MATCH p1=((a)-->(:B)-->(:C)-->(d))
OPTIONAL MATCH p2=((a)-->(:X)-->(:Y)-->(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 <> []

RETURN nodes, relationships

但请注意,对于C和X节点,这些节点是修饰节点P和R。始终有一个P节点修饰C节点,并且可以至少有一个R节点修饰P节点。

现在,对于我想要的查询返回,对于每个节点、关系,我还希望获得P、R和P正在修饰的节点的json对象的数组。更具体地说,上图的返回变为

row1: nodes(a1, b1, c1, d1, x1, y1), relationships(a1, b1, c1, d1, x1, y1), [{SRC:c1, P: p1, R:[r1, r11]}, {SRC:x1, P:p11, R:[r111]}]
   row2: nodes(a2, b2, c2, d2), relationships(a2, b2, c2, d2), [{SRC:c2, P:p2, R:[r2]}]
   row3: nodes(a3, x3, y3, d3), relationships(a3, x3, y3, d3), [{SRC:x3, P:p3, R:[r3]}]

我应该如何更改我的查询?注意:对于SRC,P,R结构,我接受其他格式,这些格式可以帮助查询更容易构建,但它需要能够识别SRC,P,R之间的相同关系。

r8xiu3jd

r8xiu3jd1#

试试这个:

MATCH (a:A), (d:D)
OPTIONAL MATCH p1=((a)-->(:B)-->(:C)-->(d))
OPTIONAL MATCH p2=((a)-->(:X)-->(:Y)-->(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

相关问题