2015-08-08 69 views
2
订购的同级别的节点

我是新来Neo4j,目前这种树状结构玩:暗号:由物业上的关系

enter image description here

在黄色方框中的数字是一对关系命名order财产CHILD_OF

我的目标是

a)至通过此属性,而不是通过直接的关系管理在同一水平的节点的排列顺序(像例如LEFTRIGHTIS_NEXT_SIBLING,等等)。

b)能够使用普通整数代替order属性的完整路径(即不保留诸如0001.0001.0002之类的东西)。

我却无法找到它是如何,或者如果可能的递归查询的图形,使其不断返回节点depth-first正确的提示,但在每个级别的排序考虑对关系order财产。

我认为如果可能的话,它可能会包括将迭代的完整路径与集合实用程序Cypher进行匹配,但我甚至没有足够接近以发布一些好的起点。

问题

我从答案有什么期望这个问题不一定是一个解决方案,但是否这样的提示是,将执行不好反正个不错的办法。在Cypher方面,如果有实际的解决方案,我很感兴趣。

我对如何将它作为一个Neo4j服务器插件与Java遍历或核心api(这并不意味着它会表现良好,但这是另一个话题)有个大致的想法,所以这个问题真的是目标设计和Cypher方面。

回答

1

这可能会实现:

match path = (n:Root {id:9})-[:CHILD_OF*]->(m) 
WITH path, extract(r in rels(path) | r.order) as orders 
ORDER BY orders 

如果抱怨数组排序,然后计算数,其中每个数字(或2个位数)是您的订单和订单被这个数字

match path = (n:Root {id:9})-[:CHILD_OF*]->(m) 
WITH path, reduce(a=1, r in rels(path) | a*10+r.order) as orders 
ORDER BY orders 
+0

谢谢,迈克尔。快速尝试第一个查询产生语法错误,而第二个查询似乎工作。我现在无法详细测试它,但会在一周内重新审视,然后批准答案或回复评论。 – sthzg

+0

修复了第一个查询 –

+0

抱歉等了很长时间才回复。对于第一个查询抱怨比较多个深度(不能从左到右比较,例如'[1,1]'到'[1]'),你是对的。第二种方法是有效的,但除非我读到错误,否则似乎不会返回“深度优先”而是“宽度优先”的结果,例如, '[11],[12],[111],[112],...,[1112]'。 – sthzg