【问题标题】:Role of variables in cypher match query变量在密码匹配查询中的作用
【发布时间】:2016-08-23 11:14:16
【问题描述】:

我在 Cypher 和 Neo4j 中采取了一些步骤,并试图了解 cypher 如何处理“变量”。

具体来说,我有一个问题

match (A {name: "A"})
match (A)<-[:st*]-(C)-[:hp]->(c)
match (A)<-[:st*]-(B)-[:hp]->(b)
match (c)-[:st]->(b)
return b

这可以完成我想要的工作。现在,在代码中,我使用了 match 子句两次(第 2 行和第 3 行),因此变量 (c) 和 (d) 在第 4 行的最终匹配之前基本上包含相同的节点。 我可以编写查询而不必重复第二个匹配子句吗?使用

match (A {name: "A"})
match (A)<-[:st*]-(B)-[:hp]->(b)
match (b)-[:st]->(b)
return b

似乎是非常不同的东西,没有返回任何内容,因为从 (b) 中的节点到自身没有 :st 类型的关系。到目前为止我的理解是,即使 (b) 和 (c) 包含相同的节点,

match (c)-[:st]->(b)

试图在 (c) 的任意节点和 (b) 的任意节点之间找到匹配项,而

match (b)-[:st]->(b)

试图从 (b) 的特定节点到自身找到匹配项?还是必须将 3 个匹配子句视为一种整体模式?

感谢您对内部工作的任何洞察...

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    当您编写 2 个 MATCH 语句时

    match (A)<-[:st*]-(C)-[:hp]->(c)
    match (A)<-[:st*]-(B)-[:hp]->(b)
    

    它们不依赖于彼此的结果(仅依赖于之前MATCH 找到A 的结果)。 Cypher 引擎可以独立执行它们,然后返回结果的笛卡尔积,或者它可以执行第一个MATCH,然后针对每个结果执行第二个MATCH,产生一系列使用第一个 MATCH 的当前结果和第二个 MATCH 的每个结果进行配对(实际实现是一个细节)。实际上,它也可以检测到相同的模式匹配了两次,只执行一次,然后从结果中生成所有可能的对。

    总而言之,bc 取自同一结果集合,但独立,因此您将获得 bc 是同一节点的对,还有其他所有不存在的对。

    如果你做一个MATCH,你显然只有一个节点。

    假设 MATCH 返回 2 个节点 12,其中 2 个中间节点 MATCH 最后的 MATCH 将看到所有 4 对:

    1 2 1 (1, 1) (1, 2) 2 (2, 1) (2, 2)

    而一个中间 MATCH 和一个最终 MATCH 使用两次 b,它只会看到:

    1 2 1 (1, 1) 2 (2, 2)

    如果你没有自我关系,那不是有趣的配对。

    请注意,如果您在没有连接的情况下对 2 个表执行SELECT,则在 SQL 数据库中也是如此:您还会得到不相关结果的笛卡尔积。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2022-01-05
      相关资源
      最近更新 更多