2016-09-27 59 views
0

给定图(或子),在这种情况下根新...的Neo4j - 算最节点

如何获得它们从根本上最远的深度节点(即不直接连接到的节点更大的深度),它们具有特定的属性。

例如...当我对其他绿色(不是最外层)(或最外层)或橙色(在它们的分支上最远)感兴趣时,如何获得绿色的“Get Me”不是绿色)。我不从关心深度....

how do I get the green "Get Me" nodes

感谢您的帮助

克里斯

+0

应该该路径只包含绿色节点?这些关系可以在任何方向吗?特定属性是标签还是属性? –

回答

2

到弗兰克斯另一种方法是找到所有的叶子节点第一个符合条件的,然后利用这些节点,筛选到那些具有路径新节点

// find all Green nodes (you can add in a filter/WHERE clause to 
// just match the ones with specific properties) 
MATCH (g:Green)--(o) 
// for each match, calculate the degree of the node (the number of 
// relationships - undirected in this example) 
WITH g, count(*) as deg 
// filter down the results to just the leaf nodes (deg 1) 
WHERE deg = 1 
WITH g 
// finally only return those that have a path to the Blue (neo) node 
MATCH (g)-[*]-(b:Blue) 
// just return the green nodes 
RETURN g; 
2

我会解决所在的路径应当只包含绿色节点的情况下(除也许),因为否则计算起来可能会非常昂贵,因为您需要查找是否还有另一个绿色节点。

注意:在我的示例中,可变长度路径是无界的,您可能需要添加一个上限以避免真正缓慢的查询。

选项1

假设属性是一个标签,和关系可以在任何方向进行遍历,您可以使用下面的查询:

MATCH p = (:Blue)-[*]-(g:Green) 
WHERE all(n IN tail(nodes(p)) WHERE n:Green) 
OPTIONAL MATCH (g)--(g2:Green) 
WITH p, collect(g2) AS greens 
WHERE size(greens) <= 1 
RETURN last(nodes(p)) 
  1. 它发现路径,只有包括绿色节点,除了可以是任何东西的开始节点。
  2. 然后它收集连接到路径最后一个节点的所有其他绿色节点。当路径简单地为(:Blue)--(g:Green)或者只有一个,当路径类似于(:Blue)--(:Green)--(g:Green)(即路径的倒数第二个节点)时,应该不存在这样的节点。如果连接了另一个绿色节点,则该路径不会在最外面的节点处结束。

它的工作原理几乎相同,如果属性是一个属性:

MATCH p = (:Blue)-[*]-(g) 
WHERE all(n IN tail(nodes(p)) WHERE n.prop = {value}) 
OPTIONAL MATCH (g)--(g2) 
WHERE g2.prop = {value} 
WITH p, collect(g2) AS greens 
WHERE size(greens) <= 1 
RETURN last(nodes(p)) 

选项2

你只遍历一个方向的关系。

MATCH p = (:Blue)-[*]->(g:Green) 
WHERE all(n IN tail(nodes(p)) WHERE n:Green) 
AND NOT (g)-->(:Green) 
RETURN last(nodes(p))