7

私は neo4j を使い始めたばかりで、グラフと関係の原則は理解していますが、モデル化したい特定の構造に少し問題があります。プログラミング言語プロジェクトで使用し、解析されたソース ファイルの AST を保存したいと考えていました。そこから、ノードに多くの追加データと関係を追加して、分析とツールを支援する予定ですが、基本的な AST はまだ少し難しいです。

ツリーを作成する単純な方法は、単純に AST をたどり、ツリー内のすべてのノードを neo4j のノードにコピーし、プロパティを使用してトークン データなどを追跡し、CHILD 関係を使用して子ノードを指すことです。 . 問題は、後でツリーをトラバースしたいときに、元の AST の正しい順序でトラバースできるようにする必要があることです。

頭のてっぺんから考えている2つの基本的なアプローチがあります。1 つは、各 CHILD リレーションシップにインデックス/序数プロパティを追加することです。もう 1 つは、最初の子に対して FIRST 関係を持ち、各子の間に NEXT 関係を持ち、そのように順序を維持することです。

これらのアプローチのいずれについても、これを正しい順序でトラバースするためにすぐに使用できるものはまだないようです。FIRST/NEXT を実行すると、neo4j が常に FIRST を最初にトラバースし、深さ優先検索を実行するように強制する限り、正しい順序を取得できると思います。それはうまくいくでしょうか?より良い方法はありますか?これは、箱から出してすぐに簡単に処理できるように思われます。

アップデート

最終的に、私は両方のアイデアを使用することにしました。子ノードには、インデックス プロパティとの CHILD 関係があります。最初の子にも FIRST_CHILD 関係があります。兄弟ノードには、正しい順序付けを行うための NEXT_SIBLING 関係があります。その後、トラバーサルは簡単でした:

//reusable traversal description
final private TraversalDescription AST_TRAVERSAL = Traversal.description()
    .depthFirst()
    .expand(new OrderedByTypeExpander()
        .add(RelType.FIRST_CHILD, Direction.OUTGOING)
        .add(RelType.NEXT_SIBLING, Direction.OUTGOING));

そして、実際に木を歩く必要があるとき、私はただすることができました

for(Path path : AST_TRAVERSAL.traverse(astRoot)){
    //do stuff here
}

私のユースケースでは、作成後にツリー構造自体を実際に変更することはありません。分析を実行して関係とプロパティを追加するだけなので、これは簡単に維持できます。さらに変更を加える必要がある場合、特に子リレーションのインデックス番号を維持したい場合は、少し手間がかかるかもしれません。ですから、同様の状況にある他の誰かのために考慮すべきことかもしれません.

もっと変更可能なものに取り掛かるとしたら、Peter Neubauer が提案したコレクションを試して、ノードを指し、子の List コレクションを使用する OrderedTreeNode クラスを作成するだけでしょう。

4

2 に答える 2

1

ラッセル、私たちはそのようなことに取り組んでおり、さまざまな YEAR-2012->MONTH-01->DAY-21->VALUE123 の線に沿って構造化された順序付けられたタイム ツリーがあり、おそらく NEXT 関係を持つでしょう。例:同じ年のMONTH。

それ以外の場合は、https://github.com/neo4j/graph-collectionsに寄稿するか調査することを検討してください。寄稿とテストは非常に高く評価されます!

于 2012-02-01T09:46:50.013 に答える