如何通过连接节点的属性和(可选)ID过滤neo4j节点?

时间:2016-12-20 13:41:51

标签: neo4j cypher

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)=nullID(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不为空时)。

0 个答案:

没有答案