【问题标题】:Combining depth- and breadth-first traversals in a single cypher query在单个密码查询中结合深度和广度优先遍历
【发布时间】:2014-02-11 07:16:15
【问题描述】:

我的图是一个树结构,有根节点和结束节点,它们之间有一行节点,[:NEXT]-> 关系从一个到下一个。沿该路径的某些节点也与其他根节点具有[:BRANCH]-> 关系,并通过它们与其他节点行建立关系。

什么 Cypher 查询将返回路径上从头到尾的节点的有序列表,任何BRANCH 关系都包含在拥有它们的节点的记录中?

编辑:这不是技术图,但基本结构是这样的:

每个节点都用黑色圆圈表示。在这种情况下,我希望这里描述每个节点。

【问题讨论】:

  • 您可以发布您的图表的示例图吗?
  • @SumeetSharma 查看编辑。

标签: neo4j cypher


【解决方案1】:

怎么样

MATCH p=(root)-[:NEXT*0..]->(leaf)
OPTIONAL MATCH (leaf)-[:BRANCH]->(branched)
RETURN leaf, branched, length(p) as l
ORDER BY l ASC

另请参阅此图表要点:http://gist.neo4j.org/?9042990

【讨论】:

    【解决方案2】:

    这个查询 - 有点慢 - 应该可以工作(我猜):

    START n=node(startID), child=node(*)
    MATCH (n)-[rels*]-(child)
    WHERE all(r in rels WHERE type(r) IN ["NEXT", "BRANCH"])
    RETURN *
    

    这是基于Neo4j 2.0.x Cypher syntax
    从技术上讲,这个查询将在从startID 开始的树的末端停止:这是因为上图中的末端属于单个路径,而不是所有分支的末端。 我还建议限制关系的基数 - [rels*1..n] - 以防止查询消失......

    【讨论】:

      【解决方案3】:

      您将无法控制根据深度优先或广度优先算法返回节点的顺序,除非您有一个变量来保存先前的元素或某种递归调用,我认为仅使用 Cypher 是不可能的.

      你能做什么

      MATCH p =(n)-[:NEXT*]->(end) 
      WITH collect(p) as node_paths
      MATCH (n1)-[:NEXT]->(m)-[:BRANCH]->(n2)
      WITH collect(m) as branch_nodes , node_paths
      RETURN branch_nodes,node_paths
      

      现在 node_paths 包含模式为 (node)-[:NEXT]->(node)-[:NEXT]->...(node) 的所有路径。现在你有了路径和分支节点(node_paths 中基本上所有路径的起点,除了从root 节点出现的路径),你可以相应地安排输出顺序。

      【讨论】:

      • “我认为仅使用 Cypher 是不可能的。” : 除了 Cypher 之外,使用 Java 或使用 Java Traversal API 怎么可能实现这一点?
      • 看看你有路径..每条路径都有节点集合..每条路径的第一个节点将是一个分支节点,您将从另一组 branch_nodes 中获得与之匹配的...而在 branch_nodes 中没有任何匹配的根节点的唯一路径将是树的根..
      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多