neo4j DB中有一个:ActivityRecord
节点,用于保存数据库中的审计记录。尝试通过各种可选参数对其进行过滤,包括执行活动的:Application
和:Tenant
组织。
Cypher查询
MATCH (ac:ActivityRecord)-[:GENERATED_IN]->(t:Tenant),
(ac:ActivityRecord)-[:GENERATED_IN]->(a:Application)
WHERE ac.objectId=coalesce(null, ac.objectId) AND ac.type=coalesce(null, ac.type)
AND ID(t)=coalesce(null, ID(t)) AND ac.changes =~ ".*test.*"
RETURN ac
ORDER BY ac.timestamp
不返回任何记录,而OPTIONAL MATCH
的查询不会适当地过滤它们(返回:ActivityRecord
类型的所有记录)。如何在ID(t)=null
或ID(a)=null
?
[UPDATE]
澄清:实际上,我从应用程序调用以下查询并将适当的参数插入到他们的位置
MATCH (ac:ActivityRecord)-[:GENERATED_IN]->(t:Tenant),
(ac:ActivityRecord)-[:GENERATED_IN]->(a:Application)
WHERE ac.objectId=coalesce({objectId}, ac.objectId)
AND ac.type=coalesce({type}, ac.type)
AND ID(t)=coalesce({tenantId}, ID(t))
AND ID(a)=coalesce({applicationId}, ID(a))
AND ac.changes =~ ".*test.*"
RETURN ac
ORDER BY ac.timestamp
因为参数是可选的,所以我需要处理未指定的情况。所以我决定在这种情况下使用ID(t)=coalesce({tenantId}, ID(t))
,如果未指定ID(t)=ID(t)
参数,则等于tenantId
(因此我们只是不按此参数进行过滤,我是什么真的会实现)。我指定的第一个查询只是上述查询的降级情况。
因此,目标是组合查询,该查询将按其属性和连接节点的ID过滤节点(仅当查询中的params不为空时)。