是否可以优化节点具有可选关系的查询?

时间:2017-11-13 22:07:01

标签: database optimization neo4j cypher

软件系统中有组织和应用程序。用户操作生成日志记录。日志记录(绿色)确实属于组织(红色),可能属于应用程序(粉红色)。

Neo4j DB model

尝试按应用程序和组织过滤节点(两个参数都是可选的),我创建了以下查询:

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

这似乎不是一个可读性和可维护性很好的代码(特别是请记住,为了简单起见,我目前排除了很多其他过滤参数),那么是否有可能优化此查询?

1 个答案:

答案 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;