【问题标题】:What is a path in neo4j cypher v2.0 and higher?neo4j cypher v2.0 及更高版本中的路径是什么?
【发布时间】:2015-11-11 16:15:15
【问题描述】:

我在neo4j 2.0 cypher-refcard读到

那个

路径不再是集合,使用nodes(path)rels(path)

现在什么是路径?为什么改变?例如,更改对路径 MATCHing 有什么影响?

【问题讨论】:

  • 如果您尝试发布到事务端点并查看我认为的数据,您会看到它们是节点和关系属性映射的有序集合。 [ {node}, {rel}, {node}, {rel}, ... {node}]
  • @DaveBennett 所以它们不再是集合,但现在它们是有序集合?
  • 路径就是路径。 @DaveBennett 从 JSON 的角度回答它们是什么。在 cypher 内部,它们是一种特殊的对象,您可以通过各种方式(例如通过节点和 rel)访问它。我觉得这更清晰直观;如果它是一个集合,它会是什么集合?不可避免的混合类型(例如 node rel node rel)。最好它应该是它自己的对象类型,以阻止人们做一些事情,比如索引偶数项做出某些假设。
  • @FrobberOfBits - 你的评论感觉很像是对我的回答。我觉得很开明——当然路径是具有不同访问方法的路径。
  • 将此从评论移至答案。

标签: neo4j cypher


【解决方案1】:

路径就是路径。 @DaveBennett 从 JSON 的角度回答它们是什么。在 cypher 内部,它们是一种特殊的对象,您可以通过各种方式(例如通过节点和 rels)访问它。我觉得这更清晰直观;如果它是一个集合,它会是什么集合?不可避免的混合类型(例如 node rel node rel)。更好的是它应该是它自己的对象类型,以阻止人们做一些事情,比如索引偶数项做出某些假设。

扩展上一个答案,这(我认为)更有意义,因为语法密码用于路径绑定,即

MATCH p=(a)-[r]-(b) RETURN p

很明显,在这个例子中p 是一些特别的东西。语法很清楚地表明a 必须是一个节点,r 绝对是一个关系。路径不是这两样东西。

从编程语言的角度来看,统一类型的“集合”是有好处的。例如。程序员可以知道如何处理Collection<String>,这意味着集合中的每个项目都遵循String 的语义规则。将路径设为集合将是有问题的,因为它不能是任何一种类型的集合。遍历路径/集合时,您将如何处理每个项目?答案是这取决于项目是什么,这往往会导致代码混乱。

同样,最好让路径成为他们自己的东西。想要遍历路径中的所有节点?这就是nodes(p) 的用途,它将为您提供一个统一类型的集合。额外的好处是它使您的密码更具可读性。

在某些方面,我在“反向解释”neo4j 开发人员所做的事情。我没有做出这个设计决定,也没有参与其中,所以我没有给你 neo4j 官方的答案为什么。这只是我对为什么设计决策(恕我直言)是一个非常好的想法的解释。它遵循您在其他地方看到的设计模式,具有某些优势。

【讨论】:

  • 对我来说很有意义。感谢相关的已回答帖子,请参阅 stackoverflow.com/questions/33655824/… ,我想我知道在哪些情况下存在路径集合(不要与路径不是 neo4j 2.0 及更高版本中的集合这一事实混淆),例如MATCH p = ()-[]-() WITH COLLECT(p) AS c RETURN ;中返回的c
  • 是的——这也是有道理的,我看到了混乱。你在这里说的是路径集合,它不会使路径成为集合。啊,软件开发。交换两个单词的顺序,你就进入了另一个世界。 :)
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多