2011-11-17 5 views
2

いくつかの調査をした後、私はプロローグの力を頼りに非常に簡単な方法でクエリを表現しました。これは私がPropelとPHPの仕事に本当に退屈になったために起こりました。データベース表の行をPrologファクトに変換する方法はありますか?

私は、データベーステーブルの行(たとえばPostgres)をPrologの事実に変換する方法があるかどうか疑問に思っていました。そうすれば、私は非常に多くの退屈が合流使用してORMを使用して停止し、代わりに私が欲しいものを得るために、このような何かを書くことができます:

mantenedora_ies(ID_MANTENEDORA, ID_IES) :- 
    papel_pessoa(ID_PAPEL_MANTENEDORA, ID_MANTENEDORA, 1), 
    papel_pessoa(ID_PAPEL_IES, ID_IES, 6), 
    relacionamento_pessoa(_, ID_PAPEL_IES, ID_PAPEL_MANTENEDORA, 3). 

私が退屈になった理由を確認するには、this postを見てください。そこにあるコードは、これらの単純な行のために置き換えられ、読みやすく理解しやすくなります。私はちょうどそれについて興味があります、それはここで物事を置き換えることは不可能なので。

PHPでそのようなことが可能であれば、それもクールです。誰かそんなことを知っていますか?

+1

http://en.wikipedia.org/wiki/Datalog – starblue

+0

ありがとう@starblue、この言語もポイントの一部です。しかし、実際のデータベースと統合して、この最後のデータベースを事実データベースに変換することはできますか? – iffs

+0

最近のバージョンのDES(http://www.fdi.ucm.es/profesor/fernan/des/)はODBCにアクセスし、Datalog/SQL – CapelliC

答えて

1

のようないくつかのパターンを変換SQLコンパイラー、(にDraxlerプロローグはあり

http://www.swi-prolog.org/pldoc/doc_for?object=section%280,%270%27,swi%28%27/doc/packages/odbc.html%27%29%29

+0

すみません、ありがとう、すぐにこの文書を見ていきます。 – iffs

+0

これは非常に速かったので間違っていたかもしれませんが、このODBCインターフェイスを使用してデータベースにクエリするために文章のようにSQLを書く必要がありますか? – iffs

+0

(現時点ではxdの回答が遅くなりました)実際には、データベースと対話するためにプロローグでSQLクエリを構築する必要があります。非常に単純なクエリを書くだけで、データを転送し、プロローグに「本当の」作業をさせることができると信じています(あるいは、複雑なクエリを書くことができ、非常に単純なプロログ述語を持つことができます。たとえば、SELECT * FROMメンバWHERE id = fooを記述するのではなく、SELECT * FROMメンバを記述し、それをプロローグで翻訳し、パターンマッチングを使用して適切なメンバを選択します。 –

1

(多分他のプロローグの実装のための同等の何かがあまりにもあります)SWI-プロローグのODBCインタフェースをチェックあなたが書いた組み合わせ)をより冗長なSQL結合に変換します。関連する投稿(prolog to SQL converter)で詳細を見つけることができます。

しかし、Prologには弱点があります。特に、集合体に関する弱点があります。ライブラリがなければ、合計、数などを得ることはあまり簡単ではありません。そして、そのようなライブラリはあまり一般的ではなく、使いやすいです。

クエリテキストを短くすることができる組み込み機能を使用して、equijoinsのPHP DBインターフェイスを特殊化することができます(これによりコードが読みやすくなります)。 SWI-Prolog/ODBCで作業しています(PHPのように)SQLを作成する必要がありますが、私は自分自身がその方法で作業していることを実感しました。

私は有用であることが判明したもう1つのアプローチ:MySQLバックアップインターフェイス(実際にはPHPMyAdmin)が使用するSQLのサブセット用のパーサーを作成しました。したがって、私は日常的にCMSのDBをローカルにダンプし、メモリにロードし、必要なタスクを適用し、挿入/更新/削除ステートメントを計算して書き込みます(または適用する)。これは、メモリに収まるDBのサイズが限られているために実行できます。私は開発しましたが、今は私はこの素朴なアプローチで小さな電子商取引thisを手に入れています。

PHPからPrologを書くのはあまり難しくありません。既存のインターフェイス(素晴らしいAdminerのようなもの)を変更しようとしましたが、すでに基本的なシリアル化フォーマットの中から選択しています。

+0

ありがとう@chac。興味深い考えですが、私はSQLへの変換を避けたいと思います。言い換えれば、私が望むのは、データベースをPrologデータベースに抽象化することです。私はそのクエリをファイルにいくつかの事実(テーブルの行)を書き込むようにしました。それが私が自動化したいものです。 – iffs

1

私はこれにはいくつかのアプローチを考えることができます - 選択にテーブルからすべてのデータを実行し、DBにそれを主張するメソッドを呼び出し、初期化時に

  1. 。各dbに対してこれを行います。次のように各行の形状を宣言する必要があります。 - 動的ies_row/4など

  2. load_filesを変更するには、user:prolog_load_filesをオーバーライドします。この活動から、#1と似たようなことができます。これは、load_files呼び出しのように見えるという利点があります。 http://www.swi-prolog.org/pldoc/man?predicate=prolog_load_file%2F2 ...このドキュメントはライブラリ(http_load)について言及していますが、私はこれをどこからでも見つけることができません(これは最近興味がありました)!

+0

ありがとう@DaveEdelstein。これらのアプローチについて:1)何らかの形で、クエリに関係するテーブルのみを選択できました。しかし、プロログデータベースとデータベース自体を同期させるのはどうでしょうか? 2)私はまだこの文書を探す必要がありますが、それはデータベースファイルを読むことですか? – iffs

関連する問題