gpt4 book ai didi

neo4j - 有没有办法将多个 WHERE 语句链接在一起而无需在 Neo4j 中切换到 AND?

转载 作者:行者123 更新时间:2023-12-01 23:28:28 26 4
gpt4 key购买 nike

我有一个使用 Neo4j 数据库的大型应用程序。有几十种方法可以保存 Cypher 查询。如果每个方法都存储自己的完整查询,为了删除可能存在的重复代码,我创建了私有(private)方法来构建小的常用查询 block 。例如,像这样的方法:

MatchNodesWithLabel(string label)

将返回部分查询,例如:
MATCH (node:label)

这些方法调用之后是添加 WHERE 的方法。或 RETURN语句来构建一个完整的查询。这是一个小例子,有一些方法可以匹配和过滤整组节点和关系。

当多个 WHERE 时出现问题语句需要链接在一起。 Cypher 不允许 WHERE遵循 WHERE 的声明陈述:
// Invalid
MATCH (node)
WHERE node:label
WHERE node.property = value
...

所以任何方法超过第一个 WHERE必须插入 AND改为声明:
// Valid
MATCH (node)
WHERE node:label
AND node.property = value
AND ...

这会产生方法排序问题,其中某些方法不能在其他方法之后使用。插入 WHERE 的方法语句( Where() 方法)必须在 And() 之前方法。 Where()And() 之后不能使用方法方法和 And() Where()之前不能使用方法方法。

以下是我为解决此排序问题而提出的一些可能(但最终被破坏)的解决方案:
  • 复制每个 Where()方法转换为等效 AndWhere()执行相同过滤的方法,但使用 AND而不是 WHERE .然后在调用代码中,使用一个Where()方法第一,AndWhere()之后的方法。
  • 由于代码重复,并且因为它使调用代码复杂化,这不是一个可接受的解决方案。它只是将方法排序问题移至调用代码,而不是解决问题。我希望能够添加 Where()随时调用,无需考虑我的方法是如何排序的
  • 添加 WHERE true在所有其他调用之前声明,然后每个 Where()方法插入 AND陈述。
  • 这仅适用于调用代码中的方法是专门排序的。全部 MATCH方法必须在 WHERE true 之前, 否则你可能会得到如下 Cypher 查询:
    MATCH (node)
    WHERE true
    AND node:type
    MATCH (somethingElse)
    AND somethingElse.property = value
    AND 起无效关注 MATCH没有 WHERE .因此,方法排序的责任又一次转移到了调用代码上。使用此解决方案,您必须手动添加 WHERE true每次您开始一系列新的过滤调用时。
  • 解析现有查询以确定 WHEREAND应该在每个 Where() 的开头使用方法。
  • 起初这似乎没问题,您所要做的就是像 existingQuery.Contains("WHERE") 这样的检查如果是真的,插入 AND反而。但是,这与#2具有相同的问题。如果一个新的MATCH插入语句,检查仍将返回 true,但查询不会处于 AND 的状态。是一个有效的陈述。因此,您必须在查询中进一步解析,检查 MATCHWHERE声明,并且您必须跟踪它们发生的顺序等……这太复杂了。

  • 是一些允许 WHERE 的 Neo4j 语法吗?插入到任何地方,还是我没有的查询构建解决方案?

    最佳答案

    添加 WITH *在每个 WHERE 之前陈述。
    WITH *会将查询中已经存在的所有命名 Cypher 标识符转移到本质上是一个新查询中。

    所以查询最终看起来像:

    MATCH (node)
    WITH *
    WHERE ...
    WITH *
    WHERE ...
    MATCH (somethingElse)
    WITH *
    WHERE ...

    等等

    这允许 WHERE插入查询中的任何位置。

    所以每 Where()方法将插入 WITH * WHERE而不仅仅是 WHEREAND .

    重要提示:这会减慢查询速度。每 WITH是一个投影,投影不是免费的。在我使用 WITH * WHERE 测试查询时比等效的 WHERE ... AND 慢 30% - 50%询问。

    这绝对是一个丑陋的解决方案。希望有一个更好的解决方案,它和 WHERE ... AND 一样快。查询并且不会使查询文本困惑,但是只要速度和查询可读性是可接受的牺牲,此解决方案就可以工作。

    编辑:我发现这个解决方案也忽略了 WHERE 中的索引。声明!对于大型数据集,这使得这些查询的性能慢得无法接受。我强烈建议不要使用这个技巧,而是牺牲一些代码可读性或代码重复以获得良好的性能。

    关于neo4j - 有没有办法将多个 WHERE 语句链接在一起而无需在 Neo4j 中切换到 AND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45557852/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com