【问题标题】:Why does returning properties in Neo4j yields unexpected results?为什么 Neo4j 中的返回属性会产生意想不到的结果?
【发布时间】:2016-10-24 12:13:15
【问题描述】:

我收到了这个 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)。

【问题讨论】:

  • 问题并不完全清楚。首先,您的图表中有一个人吗?第二,你在哪里计算结果的数量?可视化视图(“图表”)删除了“重复项”,但如果您转到表格(“行”),您应该能够看到它们。我在这里创建了一个简单的示例:gist.github.com/szarnyasg/62229f46e81b4a2dd58a5ea26017e561 - 请根据您的需要进行调整并将其添加到问题中。
  • 非常感谢您的评论。我在数据库中有多个“人”。我知道计数,因为我输入了该数量的节点用于测试目的

标签: neo4j cypher graph-databases database-management


【解决方案1】:

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

  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

【讨论】:

  • 感谢您的回答。问题是我不能使用 collect 函数,因为在使用 .As(Of T) 方法时,Neo4jsCliemt 无法读取检索到的结果。无论如何我们可以扭转这个局面吗?
  • 没有像组合一样多的结果行的唯一方法是使用collect()。我很难想象客户端如何无法将字符串或数字的集合读取为列,尤其是 Neo4j 客户端。我的意思是,单个节点属性已经可以包含一个集合,即使不诉诸collect(),所以无法读取这些是非常有限的。
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 2023-01-18
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多