为什么Neo4j中的返回属性会产生意外结果?

时间:2016-10-24 12:13:16

标签: neo4j cypher graph-databases database-management

我得到了这个Cypher查询:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

  1. 你有1个人
  2. 然后你有1个人x 13个电子邮件,即13个(人,电子邮件)元组
  3. 然后你有1个人x 13个电子邮件x 10个电话,即130个(人,电子邮件,电话)元组
  4. 您需要在每个步骤收集以避免产品:每人保留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