我的图是一个树结构,包含根节点和结束节点,以及它们之间的一系列节点,从一个到另一个节点之间具有[:NEXT]->
个关系。沿该路径的某些节点也与其他根节点具有[:BRANCH]->
关系,并通过它们与其他节点线相关。
Cypher查询将从开始到结束返回路径上节点的有序列表,并且包含它们的节点的记录中包含任何BRANCH
关系?
编辑:这不是技术图表,但基本结构如下:
将每个节点描绘为黑色圆圈。在这种情况下,我希望这里描述的每个节点。
答案 0 :(得分:6)
怎么样
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
答案 1 :(得分:1)
这个查询 - 有点慢 - 应该可以工作(我猜):
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]
- 以防止查询消失......
答案 2 :(得分:1)
除非您有一个变量来保存以前的元素或递归调用的类型,否则您将无法控制按照深度优先或广度优先算法返回节点的顺序,我认为这不仅仅是使用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
节点出现的路径之外),你可以相应地安排输出顺序。