总共有 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})]"
我不知道从哪里开始解决这个问题。我认为我对多重匹配的理解有效和/或返回条款。任何见解都将不胜感激。
就像在 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"]│
└──────────────────┴──────────────────────────────────┘