如何使用两个查询的结果集作为密码中第三个查询的参数?



Hello Neo4J/Cypher Gurus.

我需要获取两个查询的结果集,并将它们用作第三个查询的参数。 我能够使用一个(或另一个(查询的 resut 集作为第三个查询的参数,但两个查询同时不起作用。

我在努力:

// External Parameter
:params {extParam:'1.1.1'}
// First Query
MATCH p=(startnode:DerivTree)-[:IsDerivedFrom*0..]->(endnode:DerivTree)
WHERE startnode.dbvid=$extParam
UNWIND nodes(p) as query1_list
WITH distinct query1_list.dbvid as query1_result
// Second Query
MATCH (d:Resource {deleted:true})
WHERE d.dbvid=$extParam
WITH COLLECT(d) AS query2_list
UNWIND query2_list as query2_result
// Third Query
MATCH (n:Resource)
WHERE n.prop1 = query1_result
AND n.prop2 <> query2_result
AND EXISTS(n.prop3)
RETURN n

如果我尝试查询 1 和查询 3(没有使用查询 2 结果集的过滤器(,它可以工作。 如果我尝试查询 2 和查询 3(没有使用查询 1 结果集的过滤器(,它也可以工作。

但是我需要查询 3 筛选器上的查询 1 和 2 结果集。

有什么线索吗?

提前谢谢。

您正在变量之间创建笛卡尔乘积。如果对查询进行分析,则应看到操作之间流动的行数如何随着查询的进行而增加。

此外,您query1_result删除了范围之外,因为您没有将其包含在第二个查询的 WITH 中。WITH 会更改范围内的内容;如果您希望它保持在范围内,则需要包含它。

要解决此问题,您可能需要确保在此过程中收集结果(例如收集第一个查询的结果,以便基数降至 1 以避免乘法执行下一个操作(,然后对查询 2 执行相同的操作,如果您确实需要将结果作为行,请为查询 3 展开它们(尽管在您的情况下,使用in作为列表成员资格就足够了(。

试一试:

// First Query
MATCH p=(startnode:DerivTree)-[:IsDerivedFrom*0..]->(endnode:DerivTree)
WHERE startnode.dbvid=$extParam
UNWIND nodes(p) as query1 // this is not a list, so rename the variable
WITH collect(distinct query1.dbvid) as query1_results // cardinality at 1 row
// Second Query
MATCH (d:Resource {deleted:true})
WHERE d.dbvid=$extParam
WITH query1_results, COLLECT(d) AS query2_results // cardinality at 1 row
// Third Query
MATCH (n:Resource)
WHERE n.prop1 in query1_results
AND not n.prop2 in query2_results
AND EXISTS(n.prop3)
RETURN n

最新更新