Neo4j / Gremlin / Cypher:如何获取所有节点,直到我在类似地图的设置中达到一定距离(深度)?

时间:2012-01-10 14:36:22

标签: graph neo4j cypher

我有一个带字段的简单图表 - 每个字段有4个邻居(东北 - 西南):

@NodeEntity
public class Field {
    @GraphId
    Long id;
    Field north;
    Field east;
    Field south;
    Field west;
    //.. other stuff
}

我是一个图形db(neo4j)设置,所以这些都很好并且连接(像网格)。我现在要做的是获取所有节点 - 从起始节点 - 即5跳。

使用经典的遍历可以正常工作,看起来像这样:

public  Collection<Field> getFieldsWithDepth(Field startField, final int depth) {       
    Node fieldNode = this.getGraphdb().getNodeById(startField.getId());
    Traverser traverser = fieldNode.traverse(Traverser.Order.BREADTH_FIRST, // check direct relations first, then go deeper 
            new StopEvaluator() {

                @Override
                public boolean isStopNode(TraversalPosition pos) {
                    if (pos.depth()==depth)
                        return true;
                    else
                        return false;
                }
            },  // worst case: go to end of graph 
            new ReturnableEvaluator() {

                @Override
                public boolean isReturnableNode(TraversalPosition pos) {
                    return true;
                }
            },
            Relations.north,    
            Direction.OUTGOING,
            Relations.east,
            Direction.OUTGOING,
            Relations.west,
            Direction.OUTGOING,
            Relations.south,
            Direction.OUTGOING
            );

    ArrayList<Field> fields = new ArrayList<Field>();
    for (Node node : traverser.getAllNodes())
    {
        fields.add((Field)this.getGraph().get(node));
    }
    return fields;
}

所以如果我有这样的“地图”:

  1   2   | 3|   4    5 
  6  |7|  | 8| | 9|  10
|11| |12| *13* |14| |15|
 16  |17| |18| |19|  20
 21   22  |23|  24   25 

我查询起始节点''13'和“深度”2我需要得到标记的12个节点 - 因为它们距离13节点2步。

我在这里使用了jo4neo ......

如何在cypher或gremlin中实现相同的功能?

我找到了朋友的朋友示例,但这对我没有帮助,因为我需要深度作为参数(即在某些情况下我需要深度为4,有时为6)。

注意:除了Fields之外还有其他连接,但我显然只需要这些字段。此外,我需要获得所有连接的节点 - 而不仅仅是一个方向。

解决方案:感谢指针,我得到了解决方案:

start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b

2 个答案:

答案 0 :(得分:4)

http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationships

START a=node(3)
MATCH a-[:FRIEND*1..3]->x
RETURN a,x

如果您只需要3个步骤:

MATCH a-[:FRIEND*3..3]->x

希望这有帮助!

答案 1 :(得分:0)

如何找到深度?表示*1..3表示&#34; A-> B,A-> B-&gt; C&amp; A-&GT; B-&GT; C-&GT; d&#34;作为Andres的密码查询的结果,我想要找到深度计数,即在A-> B的情况下为1;在A-> B-> C&amp; C的情况下为2。等等。