Neo4j - 使用 FOREACH/CASE WHEN 技巧创建多个关系,然后 return 个关系
Neo4j - creating multiple relationships with FOREACH/CASE WHEN trick, and then return number of relationships
我正在创建一个节点,并同时在它与一堆不同的现有节点之间创建关系。其他一些节点可能不存在,所以我使用 FOREACH/CASE WHEN 技巧描述 here by neo4j staff and also .
我想 return 计算已创建的每个关系的数量,但我无法将其从 FOREACH 中提取出来。我当前的查询是这样的:
CREATE (p:Paper {title: $title})
WITH p
OPTIONAL MATCH (a:Author) WHERE a.name IN $a_names
OPTIONAL MATCH (p2:Paper) WHERE p2.title IN $citee_titles
OPTIONAL MATCH (p3:Paper) WHERE p3.title IN $citer_titles
FOREACH (_ IN CASE WHEN a IS NOT NULL THEN [1] END | MERGE (a)-[:AUTHORED]->(p))
FOREACH (_ IN CASE WHEN p2 IS NOT NULL THEN [1] END | MERGE (p)-[:CITES]->(p2))
FOREACH (_ IN CASE WHEN p3 IS NOT NULL THEN [1] END | MERGE (p3)-[:CITES]->(p))
$a_names
、$citee_titles
或 $citer_titles
中的任何一个都可以是空集或没有与任何现有节点匹配的元素。
我尝试在末尾添加 WITH 和其他 MATCHes,例如:
WITH p, a, p2, p3
OPTIONAL MATCH (a)-[r1:AUTHORED]->(p)
OPTIONAL MATCH (p)-[r2:CITES]->(p2)
OPTIONAL MATCH (p3)-[r3:CITES]->(p)
RETURN COUNT(DISTINCT r1), COUNT(DISTINCT r2), COUNT(DISTINCT r3)
它有效,但遇到了 FOREACH 解决方案试图解决的原始问题 - 如果 r1
没有匹配项,那么我不会得到 r2
和 [= 的结果19=].
关于如何处理这个问题有什么想法吗?我的目标是根据传入的参数测试创建的关系数量是否符合我的预期。
在您的查询中,您正在尝试创建与新创建的论文节点的关系,即 p
。由于只有一个 p
节点,要获得由 FOREACH
语句创建的每种类型节点的计数,您可以简单地 return distinct a
的计数, p2
、p3
个与过滤器匹配的节点,像这样
CREATE (p:Paper {title: $title})
WITH p
OPTIONAL MATCH (a:Author) WHERE a.name IN $a_names
OPTIONAL MATCH (p2:Paper) WHERE p2.title IN $citee_titles
OPTIONAL MATCH (p3:Paper) WHERE p3.title IN $citer_titles
FOREACH (_ IN CASE WHEN a IS NOT NULL THEN [1] END | MERGE (a)-[:AUTHORED]->(p))
FOREACH (_ IN CASE WHEN p2 IS NOT NULL THEN [1] END | MERGE (p)-[:CITES]->(p2))
FOREACH (_ IN CASE WHEN p3 IS NOT NULL THEN [1] END | MERGE (p3)-[:CITES]->(p))
RETURN COUNT(DISTINCT a), COUNT(DISTINCT p2), COUNT(DISTINCT p3)
我正在创建一个节点,并同时在它与一堆不同的现有节点之间创建关系。其他一些节点可能不存在,所以我使用 FOREACH/CASE WHEN 技巧描述 here by neo4j staff and also
我想 return 计算已创建的每个关系的数量,但我无法将其从 FOREACH 中提取出来。我当前的查询是这样的:
CREATE (p:Paper {title: $title})
WITH p
OPTIONAL MATCH (a:Author) WHERE a.name IN $a_names
OPTIONAL MATCH (p2:Paper) WHERE p2.title IN $citee_titles
OPTIONAL MATCH (p3:Paper) WHERE p3.title IN $citer_titles
FOREACH (_ IN CASE WHEN a IS NOT NULL THEN [1] END | MERGE (a)-[:AUTHORED]->(p))
FOREACH (_ IN CASE WHEN p2 IS NOT NULL THEN [1] END | MERGE (p)-[:CITES]->(p2))
FOREACH (_ IN CASE WHEN p3 IS NOT NULL THEN [1] END | MERGE (p3)-[:CITES]->(p))
$a_names
、$citee_titles
或 $citer_titles
中的任何一个都可以是空集或没有与任何现有节点匹配的元素。
我尝试在末尾添加 WITH 和其他 MATCHes,例如:
WITH p, a, p2, p3
OPTIONAL MATCH (a)-[r1:AUTHORED]->(p)
OPTIONAL MATCH (p)-[r2:CITES]->(p2)
OPTIONAL MATCH (p3)-[r3:CITES]->(p)
RETURN COUNT(DISTINCT r1), COUNT(DISTINCT r2), COUNT(DISTINCT r3)
它有效,但遇到了 FOREACH 解决方案试图解决的原始问题 - 如果 r1
没有匹配项,那么我不会得到 r2
和 [= 的结果19=].
关于如何处理这个问题有什么想法吗?我的目标是根据传入的参数测试创建的关系数量是否符合我的预期。
在您的查询中,您正在尝试创建与新创建的论文节点的关系,即 p
。由于只有一个 p
节点,要获得由 FOREACH
语句创建的每种类型节点的计数,您可以简单地 return distinct a
的计数, p2
、p3
个与过滤器匹配的节点,像这样
CREATE (p:Paper {title: $title})
WITH p
OPTIONAL MATCH (a:Author) WHERE a.name IN $a_names
OPTIONAL MATCH (p2:Paper) WHERE p2.title IN $citee_titles
OPTIONAL MATCH (p3:Paper) WHERE p3.title IN $citer_titles
FOREACH (_ IN CASE WHEN a IS NOT NULL THEN [1] END | MERGE (a)-[:AUTHORED]->(p))
FOREACH (_ IN CASE WHEN p2 IS NOT NULL THEN [1] END | MERGE (p)-[:CITES]->(p2))
FOREACH (_ IN CASE WHEN p3 IS NOT NULL THEN [1] END | MERGE (p3)-[:CITES]->(p))
RETURN COUNT(DISTINCT a), COUNT(DISTINCT p2), COUNT(DISTINCT p3)