Neo4J - 计算最外面的节点

时间:2016-09-27 14:14:11

标签: graph neo4j cypher

给定图形(或子图),在本例中为root Neo ...

如何获得距离根最远的节点(即不直接连接到更深的节点)具有特定属性的节点。

例如......我如何获得绿色" Get Me"节点,当我对其他绿色(它们不是最外层)或橙色(其分支最远但不是绿色)不感兴趣时​​。我不在乎深度......

how do I get the green "Get Me" nodes

感谢您的帮助

克里斯

2 个答案:

答案 0 :(得分:2)

我将解决路径应该只包含绿色节点(可能除了起始节点之外)的情况,因为否则它会变得非常昂贵,因为你需要找到是否有& #39;另一个距离的另一个绿色节点。

注意:在我的示例中,可变长度路径是无限制的,您可能希望添加一个上限以避免查询非常慢。

选项1

假设该属性是一个标签,并且可以在任何方向上遍历关系,您可以使用以下查询:

(:Blue)--(g:Green)
  1. 它找到的路径只包含绿色节点,除了起始节点可以是任何东西。
  2. 然后收集连接到路径最后一个节点的所有其他绿色节点。当路径只是(: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)) 时,应该只有一个节点,即路径的倒数第二个节点。如果连接了另一个绿色节点,则该路径不会在最外层节点处结束。
  3. 如果属性是属性,它的工作方式几乎相同:

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

    选项2

    您只能在一个方向上遍历关系。

    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;