Pythonでデータ駆動型のレガシーアプリケーションを書き直しています。プライマリテーブルの1つは「グラフテーブル」と呼ばれ、有向グラフのように見えるので、NetworkXパッケージを調べて、グラフテーブルの操作に使用する意味があるかどうかを確認し、実際に実装しました。複雑な配列のセットではなく、グラフとして表示されます。
ただし、このテーブルの使用方法が実際のグラフ操作ライブラリにあまり適していないかどうか疑問に思い始めています。NetworkX機能のほとんどは、グラフ自体を何らかの方法で特徴付けたり、2つのノード間の最短距離を決定したりすることを目的としているようです。それは私のアプリケーションには関係ありません。
ここで実際の使用法を説明できれば、誰かが私に何かが足りないのかどうかを教えてくれることを願っています-私はこれまでグラフを実際に操作したことがないので、これはかなり可能です-または他の何かを探索する必要があるかどうかデータ構造。(もしそうなら、あなたは何を提案しますか?)
この表は主に、ユーザーが指定したキーワードの文字列をコンポーネントの順序付きリストに変換するために使用します。これはユースケースの95%を構成します。他の5%は、「部分的なキーワード文字列を指定し、可能なすべての補完を提供する」および「すべての可能な有効なキーワード文字列を生成する」です。ああ、そして奇形に対してグラフを検証します。
これが表の編集された抜粋です。列は次のとおりです。
キーワードinnodeoutnodeコンポーネント
acs 1 20 clear
default 1 100 clear
noota 20 30 clear
default 20 30 hst_ota
ota 20 30 hst_ota
acs 30 10000 clear
cos 30 11000 clear
sbc 10000 10199 clear
hrc 10000 10150 clear
wfc1 10000 10100 clear
default 10100 10101 clear
default 10101 10130 acs_wfc_im123
f606w 10130 10140 acs_f606w
f550m 10130 10140 acs_f550m
f555w 10130 10140 acs_f555w
default 10140 10300 clear
wfc1 10300 10310 acs_wfc_ebe_win12f
default 10310 10320 acs_wfc_ccd1
キーワード文字列「acs、wfc1、f555w」とこのテーブルが与えられると、トラバーサルロジックは次のようになります。
ノード1から開始します。「acs」は文字列に含まれているため、ノード20に移動します。
ノード20に提示されたキーワードはいずれも文字列に含まれていないため、デフォルトを選択し、hst_otaを選択して、ノード30に移動します。
「acs」は文字列に含まれているため、ノード10000に移動します。
「wfc1」は文字列に含まれているため、ノード10100に移動します。
唯一の選択肢。ノード10101に移動します。
選択肢は1つだけなので、acs_wfc_im123を選択して、ノード10130に移動します。
「f555w」は文字列に含まれているため、acs_f555wを取得して、ノード10140に移動します。
選択肢は1つだけなので、ノード10300に移動します。
「wfc1」は文字列に含まれているため、acs_wfc_ebe_win12fを取得して、ノード10310に移動します。
選択肢は1つだけなので、acs_wfc_ccd1を選択して、ノード10320に移動します。これは存在しません。これで完了です。
したがって、コンポーネントの最終的なリストは次のようになります。
hst_ota
acs_wfc_im123
acs_f555w
acs_wfc_ebe_win12f
acs_wfc_ccd1
このテーブルのインノードとアウトノードだけからグラフを作成することはできますが、複数の可能性に直面したときにどちらを選択するかを決定するキーワード情報を組み込む方法を一生理解できませんでした。
他のユースケースの例を追加するために更新されました。
文字列"acs"が与えられた場合、可能な正当な次の選択肢として( "hrc"、 "wfc1")を返します。
文字列「acs、wfc1、foo」を指定すると、未使用のキーワードが原因で例外が発生します
可能なすべての有効な文字列を返します。
- cos
- acs、hrc
- acs、wfc1、f606w
- acs、wfc1、f550m
- acs、wfc1、f555w
すべてのノードに到達できること、およびループがないことを検証します。
これらの最初の2つについてはAlexのソリューションを微調整できますが、最後の2つについてはそれを行う方法がわかりません。