给定图(或子),在这种情况下根新...的Neo4j - 算最节点
如何获得它们从根本上最远的深度节点(即不直接连接到的节点更大的深度),它们具有特定的属性。
例如...当我对其他绿色(不是最外层)(或最外层)或橙色(在它们的分支上最远)感兴趣时,如何获得绿色的“Get Me”不是绿色)。我不从关心深度....
感谢您的帮助
克里斯
给定图(或子),在这种情况下根新...的Neo4j - 算最节点
如何获得它们从根本上最远的深度节点(即不直接连接到的节点更大的深度),它们具有特定的属性。
例如...当我对其他绿色(不是最外层)(或最外层)或橙色(在它们的分支上最远)感兴趣时,如何获得绿色的“Get Me”不是绿色)。我不从关心深度....
感谢您的帮助
克里斯
到弗兰克斯另一种方法是找到所有的叶子节点第一个符合条件的,然后利用这些节点,筛选到那些具有路径新节点
// 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;
我会解决所在的路径应当只包含绿色节点的情况下(除也许),因为否则计算起来可能会非常昂贵,因为您需要查找是否还有另一个绿色节点。
注意:在我的示例中,可变长度路径是无界的,您可能需要添加一个上限以避免真正缓慢的查询。
假设属性是一个标签,和关系可以在任何方向进行遍历,您可以使用下面的查询:
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))
(: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))
你只遍历一个方向的关系。
MATCH p = (:Blue)-[*]->(g:Green)
WHERE all(n IN tail(nodes(p)) WHERE n:Green)
AND NOT (g)-->(:Green)
RETURN last(nodes(p))
应该该路径只包含绿色节点?这些关系可以在任何方向吗?特定属性是标签还是属性? –