为什么 Neo4j 中多个匹配会生成重复值?

问题描述 投票:0回答:1

总共有 6 个节点,有两个标签(time1 和 time2),每个标签有 3 个节点。

当我运行时: match (a:time1) return Collect(a) 我得到一个包含 3 个节点的列表,标签为 time1。这是预料之中的。

但是,当我尝试运行时: match (a:time1), (b:time2) returncollect(a),collect(b) 我希望得到 2 个列表,每个列表有 3 个元素。 相反,我得到 2 个列表,每个列表有 9 个元素,每个元素有 3 个重复元素。 以下是输出的csv文件:

收集(a),收集(b) "[(:time1 {con1: 0.9,con2: 0.0,con3: 0.0}), (:time1 {con1: 0.9,con2: 0.0,con3: 0.0}), (:time1 {con1: 0.9,con2: 0.0, con3: 0.0}), (:time1 {con1: 0.0,con2: 0.4,con3: 0.0}), (:time1 {con1: 0.0,con2: 0.4,con3: 0.0}), (:time1 {con1: 0.0, con2: 0.4,con3: 0.0}), (:time1 {con1: 0.0,con2: 0.0,con3: 0.5}), (:time1 {con1: 0.0,con2: 0.0,con3: 0.5}), (:time1 { con1: 0.0,con2: 0.0,con3: 0.5})]","[(:time2 {con1: 0.9,con2: 0.0,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.4,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.0,con3: 0.5}), (:time2 {con1: 0.9,con2: 0.0,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.4,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.0,con3: 0.5}), (:time2 {con1: 0.9,con2: 0.0,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.4,con3: 0.0}), (:time2 {con1: 0.0,con2: 0.0,con3: 0.5})]"

我不知道从哪里开始解决这个问题。我认为我对多重匹配的理解有效和/或返回条款。任何见解都将不胜感激。

neo4j
1个回答
0
投票

就像在 SQL 中一样,彼此不连接的查询部分将产生交叉/笛卡尔积。

采用以下简单的 2 人 2 部电影图表:

CREATE (:Person {name: "Neo"}), (:Person {name: "Trinity"})
CREATE (:Movie {title: "Matrix"}), (:Movie {title: "The Matrix, Reloaded"})

如果您查询所有人和电影,它将为每个人生成组合:

MATCH (p:Person), (m:Movie)
RETURN p.name, m.title

╒═════════╤══════════════════════╕
│p.name   │m.title               │
╞═════════╪══════════════════════╡
│"Neo"    │"Matrix"              │
├─────────┼──────────────────────┤
│"Neo"    │"The Matrix, Reloaded"│
├─────────┼──────────────────────┤
│"Trinity"│"Matrix"              │
├─────────┼──────────────────────┤
│"Trinity"│"The Matrix, Reloaded"│
└─────────┴──────────────────────┘

您可以用更大尺寸的图形来想象笛卡尔积的大小。

您通常会使用

WITH
子句来分解查询:

MATCH (p:Person)
WITH collect(p.name) AS persons
MATCH (m:Movie)
RETURN persons, collect(m.title) AS movies

╒══════════════════╤══════════════════════════════════╕
│persons           │movies                            │
╞══════════════════╪══════════════════════════════════╡
│["Neo", "Trinity"]│["Matrix", "The Matrix, Reloaded"]│
└──────────────────┴──────────────────────────────────┘

或者使用更现代的 Cypher,例如

COLLECT
子查询:

RETURN 
    COLLECT {
        MATCH (p:Person)
        RETURN p.name
    } AS persons,
    COLLECT {
        MATCH (m:Movie)
        RETURN m.title
    } AS movies

╒══════════════════╤══════════════════════════════════╕
│persons           │movies                            │
╞══════════════════╪══════════════════════════════════╡
│["Neo", "Trinity"]│["Matrix", "The Matrix, Reloaded"]│
└──────────────────┴──────────────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.