给定图形(或子图),在本例中为root Neo ...
如何获得距离根最远的节点(即不直接连接到更深的节点)具有特定属性的节点。
例如......我如何获得绿色" Get Me"节点,当我对其他绿色(它们不是最外层)或橙色(其分支最远但不是绿色)不感兴趣时。我不在乎深度......
感谢您的帮助
克里斯
答案 0 :(得分:2)
我将解决路径应该只包含绿色节点(可能除了起始节点之外)的情况,因为否则它会变得非常昂贵,因为你需要找到是否有& #39;另一个距离的另一个绿色节点。
注意:在我的示例中,可变长度路径是无限制的,您可能希望添加一个上限以避免查询非常慢。
假设该属性是一个标签,并且可以在任何方向上遍历关系,您可以使用以下查询:
(: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))
您只能在一个方向上遍历关系。
myDf %>%
gather(key, value, -id, -event) %>%
filter(!is.na(value)) %>%
group_by(id, event) %>%
summarise(count = n(),
sum = sum(value)) %>%
gather(key, value, -id, -event) %>%
unite(measure, key, event) %>%
spread(measure, value)
答案 1 :(得分:2)
Franks的另一种方法是首先找到符合条件的所有叶节点,然后使用这些节点,向下筛选到那些具有Neo节点路径的节点
// 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;