【问题标题】:neo4j stop traversal on condition (cypher)neo4j 在条件下停止遍历(密码)
【发布时间】:2013-05-02 19:25:48
【问题描述】:

如果这是一个愚蠢的问题,请原谅我刚刚开始,但我想知道如何停止遍历节点属性值上的树。

例如。如果您有一个带有节点和子节点的树型图。所有节点都具有published 的属性,即10。我想遍历树,不包括任何带有published:0 的节点(也不是孩子,即使他们有published:1

到目前为止(n 是根节点)n-[:HAS_CHILD_CONTENT*]->m WHERE m.published=1 return m; 显然会简单地返回所有已发布的节点,而忽略某些节点具有未发布的父节点的事实

谁能帮我解决这个问题?提前致谢。

PS: 我正在通过ubuntu 12.04 LTS 上的webapp cypher shell 使用Neo4j - Graph Database Kernel 2.0.0-M02

【问题讨论】:

  • 为什么不加AND n.published = 1
  • @ean5533 这不起作用。即使父节点之一未发布,它仍会选择已发布的子节点
  • 啊,您在查询中添加了以前没有的 *
  • @ean5533 是的,很抱歉。我后来才意识到我忘了把它放进去

标签: neo4j cypher graph-databases


【解决方案1】:

你可以检查路径,比如

match p=root-[:PARENT*..]-file 
   where root.name='a' and all(x in nodes(p) WHERE x.published = true) 
return p;

http://docs.neo4j.org/chunked/preview/query-function.html#functions-all

有关示例,请参阅 http://bit.ly/12ARbL5

【讨论】:

  • 太完美了!!非常感谢你!我错过了从文档中以这种方式使用的所有内容。你知道all 对查询性能有什么影响吗?和/或是否有优化性能的方法?
  • 它可能不是最快的,因为 Cypher 还没有将这些交叉路径表达式拉入模式匹配器。如果性能不能满足您的需求,请查看 Java 核心 API(node.getRelationshipsnode.getProperty)或遍历 API(docs.neo4j.org/chunked/milestone/tutorial-traversal.html),以便在遇到未发布的父级时缩短遍历。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多