3

フィールドのある単純なグラフがあります。各フィールドには4つの隣接フィールド(北東-南西)があります。

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

私はグラフデータベース(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を使用しました...

暗号またはグレムリンで同じ機能を実現するにはどうすればよいですか?

友達の例を見つけましたが、深さをパラメーターにする必要があるため、これは実際には役に立ちません(つまり、深さ4、場合によっては6が必要な場合もあります)。

注:フィールド以外の接続もありますが、必要なのは明らかにフィールドだけです。また、一方向だけでなく、接続されているすべてのノードを取得する必要があります。

解決策:ポインターのおかげで私は解決策を得ました:

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

2 に答える 2

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

お役に立てれば!

于 2012-01-10T15:02:21.207 に答える
0

そして、深さのレベルを見つけるために何をすべきか?Andresによる暗号クエリの結果として*1..3「A->B、A-> B-> C&A-> B-> C-> D」と表示されるので、深さのカウントを見つけたいのは何ですか。 A->Bの場合は1。2 A->B->Cなどの場合。

于 2014-03-13T06:47:15.547 に答える