0

我得到了这个密码查询:

match (c:Person)
match (c)-[:eml]->(emls:Email)
match (c)-[:phn]->(phns:Phone)
return phns.Number, emls.Value

Email点数为 13,Phone节点数为 10。

当我返回节点时,结果是:13Email个节点和 10 个Phone节点但是当我返回一个属性时,比如说:phones.Number,我得到 130 个重复的结果(数字来自 13 * 10)。

4

1 回答 1

4

每次通过匹配新模式来扩展结果图时,都会执行先前结果与新结果的笛卡尔积:

  1. 你有1个人
  2. 然后你有 1 个人 x 13 封电子邮件,即 13 个(个人,电子邮件)元组
  3. 然后你有 1 个人 x 13 电子邮件 x 10 电话,即 130(个人、电子邮件、电话)元组

您需要在每一步收集以避免产品:您保留每人 1 行结果,或 1(人、电子邮件、电话)元组,其中电子邮件和电话都是集合。

MATCH (c:Person)
OPTIONAL MATCH (c)-[:eml]->(emls:Email)
WITH c, collect(emls.Value) AS emails
OPTIONAL MATCH (c)-[:phn]->(phns:Phone)
RETURN c, emails, collect(phns.Number) AS phones
于 2016-10-24T14:29:48.790 回答