(Neo4j 3.5) 执行包含两部分的查询,第二部分包含一组匹配,其中至少需要满足一个

(Neo4j 3.5) Executing query with two parts and the second one consists on a group of matches where at least one needs to be fulfilled

我们正在尝试 运行 密码查询,但无法获得我们想要的结果。

重要的是要注意,我们无法使用子查询进行这项工作,因为我们使用的是 Neo4j 3.5,在此版本中,它们仍然不可用。

问题是我们有两个查询部分,第一个部分将固定第二部分的变量,第二部分由多个匹配组成,它必须获得前一个查询的结果和如果至少有一个匹配项 return 是一行的结果,则该行不会被过滤掉,否则如果 none return 结果将被丢弃。

更具体地说,我们尝试 运行 的查询类似于以下查询:

//First part of the query where we want to fix variables with the match and where
MATCH (u:User)-[:ASSIGNED_TO]->(t:Task)-[:PENDING]->(ob:Object)<-[:HAS_OPEN_OBJECT]-(do:DataObject)<-[:ASOCIATED]-(:Module)-[:CAN_LIST]->(view:WidgetObject)
                        WHERE u.uid = 'user_uid' 
                        AND view.uid = 'view_uid' 
                        AND view.object_name = do.object_type
                        with do, t, ob

// In this second part of the query we want to maintain the variables of the previous part and if at least one matches the value should be returned
// we have tried with UNION but we will need pagination, but even with union it's not working 
MATCH (ac:Action)<-[:ASOCIATED]-(t)-[rel:COMPLETED|PENDING]->(ob)<-[:HAS_OPEN_OBJECT|HAS_CLOSED_OBJECT]-(do)
                WHERE ac.name CONTAINS 'body'
                WITH COLLECT({data_object_uid: do.uid}) as act_filter
MATCH (c:Comment)<-[:COMMENTED]-(t)-[rel:COMPLETED|PENDING]->(ob)<-[:HAS_OPEN_OBJECT|HAS_CLOSED_OBJECT]-(do)
                WHERE c.body CONTAINS 'body'
                WITH act_filter  + COLLECT({data_object_uid: do.uid}) as comment_filter
MATCH (at:Attachment)<-[:HAS_ATTACHMENT]-(t)-[rel:COMPLETED|PENDING]->(ob)<-[:HAS_OPEN_OBJECT|HAS_CLOSED_OBJECT]-(do)
                WHERE at.name CONTAINS 'body'
                WITH comment_filter + COLLECT({data_object_uid: do.uid}) as attachment_filter
                UNWIND attachment_filter as row
                return row.data_object_uid

我们不确定在第二部分中,第二个和第三个匹配是否保持来自查询第一部分的相同结果子集。

我们发现一个有趣的行为是,如果我们删除最后一个匹配项,我们会得到结果,但如果我们添加它,我们就得不到任何结果。我们不理解这种行为,因为如果第二个匹配是 returning 结果并且它们在收集后存储在一个变量中,将其附加到下一个收集的结果应该 return 东西。

例如,如果第二个匹配 returns 为 comment_filter [{data_object_uid: "343dienmd3-dasd"}] 而第三个匹配没有 returning 任何东西,在 WITH 子句应该 return 同样的事情,但结果是空的。

我们需要一些启发,我们不知道我们是否接近了,我们犯了一个愚蠢的错误,或者我们完全错了,我们需要彻底改变方法。

由于您不知道第二部分中的三场比赛中的哪一场会产生结果,我将按照以下几行进行尝试:

注意我使用了 ASSOCIATED 而不是 ASOCIATED

MATCH (n)<-[:ASSOCIATED|COMMENTED|HAS_ATTACHMENT]-(t)-[rel:COMPLETED|PENDING]->(ob)<-[:HAS_OPEN_OBJECT|HAS_CLOSED_OBJECT]-(do)
WHERE 
      (n:Action AND n.name CONTAINS 'body')
      OR
      (n:Comment AND n.body CONTAINS 'body')
      OR 
      (n:Attachment AND n.name CONTAINS 'body')
RETURN COLLECT(DISTINCT {data_object_uid: do.uid})