首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Neo4j/ Cypher查找所选子图的所有叶子

使用Neo4j/ Cypher查找所选子图的所有叶子
EN

Stack Overflow用户
提问于 2018-08-29 07:09:01
回答 1查看 256关注 0票数 2

初始情况

具有树状结构的

  • Large Neo4j 3.4.6图(10层深,1000万nodes).
  • Unexceptional所有节点相互连接。节点以及关系在每种情况下都是相同类型的。
  • 恰好有一个中心根节点。
  • 简化和简化示例:

Graphic representation

代码语言:javascript
复制
CREATE (Root:CustomType {name: 'Root'})
CREATE (NodeA:CustomType {name: 'NodeA'})
CREATE (NodeB:CustomType {name: 'NodeB'})
CREATE (NodeC:CustomType {name: 'NodeC'})
CREATE (NodeD:CustomType {name: 'NodeD'})
CREATE (NodeE:CustomType {name: 'NodeE'})
CREATE (NodeF:CustomType {name: 'NodeF'})
CREATE (NodeG:CustomType {name: 'NodeG'})
CREATE (NodeH:CustomType {name: 'NodeH'})
CREATE (NodeI:CustomType {name: 'NodeI'})
CREATE (NodeJ:CustomType {name: 'NodeJ'})
CREATE (NodeK:CustomType {name: 'NodeK'})
CREATE (NodeL:CustomType {name: 'NodeL'})
CREATE (NodeM:CustomType {name: 'NodeM'})
CREATE (NodeN:CustomType {name: 'NodeN'})
CREATE (NodeO:CustomType {name: 'NodeO'})
CREATE (NodeP:CustomType {name: 'NodeP'})
CREATE (NodeQ:CustomType {name: 'NodeQ'})

CREATE
  (Root)-[:CONTAINS]->(NodeA),
  (Root)-[:CONTAINS]->(NodeB),
  (Root)-[:CONTAINS]->(NodeC),
  (NodeA)-[:CONTAINS]->(NodeD),
  (NodeA)-[:CONTAINS]->(NodeE),
  (NodeA)-[:CONTAINS]->(NodeF),
  (NodeE)-[:CONTAINS]->(NodeG),
  (NodeE)-[:CONTAINS]->(NodeH),
  (NodeF)-[:CONTAINS]->(NodeI),
  (NodeF)-[:CONTAINS]->(NodeJ),
  (NodeF)-[:CONTAINS]->(NodeK),
  (NodeI)-[:CONTAINS]->(NodeL),
  (NodeI)-[:CONTAINS]->(NodeM),
  (NodeJ)-[:CONTAINS]->(NodeN),
  (NodeK)-[:CONTAINS]->(NodeO),
  (NodeK)-[:CONTAINS]->(NodeP),
  (NodeM)-[:CONTAINS]->(NodeQ);

有待解决的挑战

  • 通过使用带展开的匹配Cypher查询,我可以成功地选择一个子树并将其绑定到路径。假设子树跨越节点A、E、F、I和J。
  • 基于此路径,我现在需要子树的所有叶子,而不是整个树。

代码语言:javascript
复制
MATCH
  path = (:CustomType {name:'NodeA'})-[:CONTAINS*]->(:CustomType {name:'NodeJ'}) /* simplified */
WITH
  nodes(path) as selectedPath
  /* here: necessary magic to identify the leaf nodes of the subtree */
RETURN
  leafNode;

  • 和其他事情我试图用WHERE NOT(node-->())方法来解决这个需求,但我意识到这只适用于整个树的叶子。不幸的是,我不能说服Cypher子句尊重所选子树,我如何才能找到具有boundaries.
  • So,和Neo4j的选定子图的所有叶子?你能给我一个如何解决这个挑战的建议吗?非常感谢您为我指明了正确的方向!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-29 07:57:22

您正确地注意到,没有子节点的check节点只适用于整个树。因此,您需要遍历子树中的所有关系,并找到子树中的这样一个节点,它是关系的结束,而不是关系的开始:

代码语言:javascript
复制
MATCH
  path = (:CustomType {name:'NodeA'})-[:CONTAINS*]->(:CustomType {name:'NodeJ'})
UNWIND relationShips(path) AS r
WITH collect(DISTINCT endNode(r))   AS endNodes, 
     collect(DISTINCT startNode(r)) AS startNodes
UNWIND endNodes AS leaf
WITH leaf WHERE NOT leaf IN startNodes
RETURN leaf
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52067335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档