我在db:
中使用了这种数据模型(a)<-[:has_parent]<-(b)-[:has_parent]-(c)<-[:has_parent]-(...)
每个家长都可以有多个孩子和一个孩子。这可能会持续到未知数量的水平。
我想为每个节点找到这些值
&安培;我想根据这些值对返回的节点进行排名。现在,没有优化,查询运行速度非常慢(特别是当后代数量增加时)。
问题:
编辑:
查询使用START
或MATCH
澄清:
一个。查询可以从层次结构中的任何点开始,而不仅仅是根节点
湾起始节点下的每个节点按其所具有的后代的总数,每个后代的距离(来自返回的节点)返回。它拥有的每个后代的时间戳。
℃。通过后代我的意思是它下面的一切,而不仅仅是它的直接孩子
例如,
这是一个示例图: http://console.neo4j.org/r/awk6m2
答案 0 :(得分:3)
首先,您需要知道如何查找根节点。以下语句查找没有outboung父关系的节点 - 请注意该语句在大图中可能很昂贵。
MATCH (n)
WHERE NOT ((n)-[:has_parent]->())
RETURN n
相反,您应该使用索引来查找该节点:
MATCH (n:Node {name:'abc'})
从我们的根节点开始,我们遍历变量深度的入站父关系。在遍历的每个节点上,我们计算子节点的数量 - 因为这可能为零,所以使用了OPTIONAL MATCH
:
MATCH (root:Node) // line 1-3 to find root node, replace by index lookup
WHERE NOT ((root)-[:has_parent]->())
WITH root
MATCH p =(root)<-[:has_parent*]-() // variable path length match
WITH last(nodes(p)) AS currentNode, length(p) AS currentDepth
OPTIONAL MATCH (currentNode)<-[:has_parent]-(c) // tranverse children
RETURN currentNode, currentNode.created, currentDepth, count(c) AS countChildren