Neo4j深层次查询

时间:2015-02-17 07:49:26

标签: neo4j

我在db:

中使用了这种数据模型
(a)<-[:has_parent]<-(b)-[:has_parent]-(c)<-[:has_parent]-(...)

每个家长都可以有多个孩子和一个孩子。这可能会持续到未知数量的水平。

我想为每个节点找到这些值

  • 它拥有的后代数
  • 每个后代的深度[距节点的距离]
  • 每个后代的创作时间

&安培;我想根据这些值对返回的节点进行排名。现在,没有优化,查询运行速度非常慢(特别是当后代数量增加时)。

问题:

  • 我可以在模型中做些什么来使查询具有高性能(索引,数据结构......)
  • 我可以在查询中做些什么
  • 我还能在其他地方做什么?

编辑:

查询使用STARTMATCH

从特定节点开始

澄清:

一个。查询可以从层次结构中的任何点开始,而不仅仅是根节点

湾起始节点下的每个节点按其所具有的后代的总数,每个后代的距离(来自返回的节点)返回。它拥有的每个后代的时间戳。

℃。通过后代我的意思是它下面的一切,而不仅仅是它的直接孩子

例如,

这是一个示例图: http://console.neo4j.org/r/awk6m2

1 个答案:

答案 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