软件系统中有组织和应用程序。用户操作生成日志记录。日志记录(绿色)确实属于组织(红色),可能属于应用程序(粉红色)。
尝试按应用程序和组织过滤节点(两个参数都是可选的),我创建了以下查询:
MATCH
(log0:Log)-[:GENERATED_IN]->(org:Organization),
(app:Application)<-[:GENERATED_IN]-(log1:Log)-[:GENERATED_IN]->(org:Organization)
WHERE ($orgID IS NULL
OR ID(org)=$orgID)
AND ($appID IS NULL
OR ID(app)=$appID)
RETURN DISTINCT
CASE $appID
WHEN null THEN log0
ELSE log1
END
CASE $appID
WHEN null then log1
ELSE null
END
我使用2个CASE
表达式,因为Cypher只返回与:Organization
没有关系的节点log0
(尽管我希望返回所有:Log
个节点)因为没有可能从CASE
返回多个变量,i。即
RETURN DISTINCT
CASE $appID
WHEN null THEN log0, log1
ELSE log1
这似乎不是一个可读性和可维护性很好的代码(特别是请记住,为了简单起见,我目前排除了很多其他过滤参数),那么是否有可能优化此查询?
答案 0 :(得分:1)
您的查询可以返回包含1或2个Log
节点的地图,如下所示:
MATCH
(log0:Log)-[:GENERATED_IN]->(org:Organization),
(app:Application)<-[:GENERATED_IN]-(log1:Log)-[:GENERATED_IN]->(org)
WHERE ($orgID IS NULL OR ID(org)=$orgID)
AND ($appID IS NULL OR ID(app)=$appID)
RETURN DISTINCT
CASE $appID WHEN NULL
THEN {a: log0, b: log1}
ELSE {a: log1}
END AS result;