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