给定 3 个表达式,用密码来选择唯一的节点匹配

问题描述 投票:0回答:1

我有很多具有属性/属性的节点:p1、p2、p3、p4、p5 等;

给出 3 个正则表达式的数组:

exp1 -> p1 = 1
exp2 -> p2 = 2 OR p3 = 3
exp3 -> p4 = 4 AND p5 = 5

每个表达式匹配可能会产生 0、1 或更多节点。

如果上述任何表达式可以与一个节点完全匹配,您可以帮助编写单个密码查询来选择唯一节点吗?

如果所有给定表达式与超过 1 个节点匹配或没有节点匹配,则返回 null。


我尝试了什么?

现在,我正在使用此查询并编写应用程序代码来检查任何集合是否包含唯一/仅一个节点:

Optional MATCH (n1) WHERE n1.p1=1 WITH COLLECT(n1) as c1
Optional MATCH (n2) WHERE (n2.p2=2 OR n2.p3=3 ) WITH c1,COLLECT(n2) as c2
Optional MATCH (n3) WHERE (n3.p4=4 AND n3.p5=5 ) WITH c0,c1,COLLECT(n2) as c3
RETURN c1,c2,c3

我想要什么?

不是返回集合,而是如果任何集合恰好包含 1 个节点,则返回它或返回 null。

neo4j cypher
1个回答
0
投票
OPTIONAL MATCH (n1) WHERE n1.p1=1 WITH COLLECT(n1) as c1
OPTIONAL MATCH (n2) WHERE (n2.p2=2 OR n2.p3=3 ) WITH c1, COLLECT(n2) as c2
OPTIONAL MATCH (n3) WHERE (n3.p4=4 AND n3.p5=5 ) WITH c1, c2, COLLECT(n3) as c3
RETURN
  CASE WHEN SIZE(c1) = 1 THEN c1[0] ELSE NULL END AS n1,
  CASE WHEN SIZE(c2) = 1 THEN c2[0] ELSE NULL END AS n2,
  CASE WHEN SIZE(c3) = 1 THEN c3[0] ELSE NULL END AS n3
© www.soinside.com 2019 - 2024. All rights reserved.