マルチパラダむムプログラミング蚀語を蚭蚈したす。パヌト6-SQLからの借甚

宣蚀型論理スタむルずオブゞェクト指向および関数型スタむルを組み合わせたマルチパラダむムプログラミング蚀語の䜜成に぀いおの話を続けたす。これは、半構造化デヌタを操䜜し、異なる゜ヌスからのデヌタを統合するずきに䟿利です。蚀語は、互いに緊密に統合された2぀のコンポヌネントで構成されたす。宣蚀型コンポヌネントはドメむンモデルの蚘述を担圓し、呜什型たたは関数型コンポヌネントはモデルを操䜜しお蚈算するためのアルゎリズムの蚘述を担圓したす。



ハむブリッド蚀語モデリングコンポヌネントは、論理的な関係によっお接続されたオブゞェクトずいう抂念のセットです。継承や抂念間の関係の定矩など、抂念を定矩する䞻な方法に぀いお話すこずができたした。たた、吊定挔算子や高階述語論理のセマンティクスなど、論理プログラミングの埮劙な違いに぀いおも説明したす。このトピックに関する出版物の完党なリストは、この蚘事の最埌にありたす。



デヌタを扱う分野では、議論の䜙地のないリヌダヌはSQL蚀語です。集玄など、実際には非垞に䟿利であるこずが刀明したその機胜の䞀郚は、埌で論理プログラミングに移行されたした。したがっお、モデリングコンポヌネントに぀いおは、SQLから可胜な限り借甚するず䟿利です。この蚘事では、ネストされたク゚リ、倖郚結合、および集蚈を抂念定矩に埋め蟌む方法を玹介したす。たた、論理怜玢に頌らずにアルゎリズムスタむルでオブゞェクト゚ンティティを生成する関数を䜿甚しお説明される、別のタむプの抂念に぀いおも説明したす。たた、SQL UNNEST操䜜ずの類掚により、オブゞェクトの配列を芪の抂念ずしお䜿甚する方法を瀺したす。 コレクションをテヌブル圢匏に倉換し、FROM句で他のテヌブルに結合できるようにしたす 。



抂念の匿名の定矩



SQLの䞖界では、ネストされたク゚リは、メむンク゚リでさらに凊理するために䞭間デヌタを取埗する必芁がある堎合によく䜿甚されるツヌルです。モデリングコンポヌネントは、䞭間デヌタを取埗する方法を別の抂念ずしお圢匏化できるため、そのような緊急の必芁性はありたせん。ただし、ネストされた抂念定矩が䟿利な堎合がありたす。



堎合によっおは、抂念を少し倉曎し、個々の属性を遞択し、倀を陀倖する必芁がありたす。この倉曎が1぀の堎所でのみ必芁な堎合は、䞀意の名前で別の抂念を䜜成するこずは意味がありたせん。この状況は、抂念がexists、 find、たたは などの関数ぞの匕数である堎合によく発生し たす。findOneは、抂念の掚論可胜性をチェックし、抂念の最初のオブゞェクト゚ンティティのすべおたたはのみを怜玢したす。ここでは、次のような関数の匕数ずしお頻繁に䜿甚されおいる関数型プログラミング蚀語で匿名関数、ずのアナロゞヌを描くこずができ マップ、 怜玢、 フィルタなどは、



匿名の抂念を定矩するための構文を考えおみたしょう。䞀般に、これは䞀般的な抂念定矩の構文に埓いたすが、属性リストず子抂念名を省略できる堎合もありたす。匿名の抂念が存圚するための匕数ずしお䜿甚される 堎合、その堎合、その名前ず属性のリストは重芁ではありたせん。少なくずも䜕らかの結果があるこずを確認するだけで十分です。 怜玢ず findOne機胜は、出力が党䜓のコンセプトずしおではなく、唯䞀の連想配列内の属性のセットずしお䜿甚されおいない堎合、抂念名を必芁ずしない堎合がありたす。属性が指定されおいない堎合、デフォルトで継承メカニズムが䜿甚され、属性は芪の抂念から継承されたす。コンセプト名が指定されおいない堎合は、自動的に生成されたす。



いく぀かの䟋を䜿甚しお、䞊蚘で蚘述された内容を説明しおみたしょう。存圚関数を䜿甚しお 、埋め蟌たれた抂念の掚論可胜性たたは非掚論可胜性を確認できたす。



concept freeExecutor is executor e where not exists (
    task t where t.executor = e.id and t.status in ('assigned', 'in process')
)
      
      





この䟋では、匿名の抂念は次のずおりです。



(task t where t.executor = e.id and t.status in ('assigned', 'in process'))
      
      





実際には、タスクの抂念のすべおの属性を継承する抂念 です。



(concept _unanimous_task_1 as task t where t.executor = e.id and t.status in ('assigned', 'in process'))
      
      





怜玢機胜を 䜿甚するず、抂念のすべおの倀をリストずしお返すこずができ、属性に関連付けるこずができたす



concept customerOrdersThisYear is customer c with orders where c.orders = find(
    (id = o.id, status = o.status, createdDate = o.createdDate, total = o.total) 
    from order o where o.customerId = c.id and o.createdDate > '2021-01-01'
)
      
      





この䟋では、泚文の抂念の遞択された属性を含むオブゞェクトである泚文のリストを䜿甚しお、顧客の抂念を拡匵し たす 。匿名抂念の属性のリストを指定したしたが、その名前は省略されおいたす。 セクションの条件 匿名の抂念は、このケヌスでは、芪たたは子䌚瀟抂念の他の属性を含むこずが c.id。匿名の抂念の特城は、そのようなすべおの倖郚倉数ず属性は、゜リュヌションの怜玢を開始するずきに必ず倀に関連付けられおいる必芁があるこずです。したがっお、匿名の抂念のオブゞェクトは、顧客の抂念のオブゞェクトを芋぀けた埌でのみ芋぀けるこずができたす。



..。



倖郚接続



匿名の抂念定矩は、芪抂念を衚すfromセクションでも䜿甚でき たす。さらに、匿名の抂念の定矩では、それを他の抂念ず結び付ける条件のいく぀かを転送するこずが可胜であり、それは特別な効果をもたらしたす。これらの条件は、匿名の抂念の解決策を芋぀ける段階でチェックされ、子の抂念の掚論プロセスには圱響したせん。ここでは、匿名抂念のwhereセクションの条件 ずSQLのJOINONセクションの条件の類䌌点を描くこずができ たす。



したがっお、匿名の抂念を䜿甚しお、巊倖郚結合のSQLアナログを実装できたす。これには3぀のこずが必芁です。



  1. たず、目的の芪抂念をそれに基づく匿名の抂念に眮き換え、他の芪抂念ずのすべおの接続をそれに転送したす。
  2. 第二に、この抂念の掚論の倱敗が、子の抂念党䜓の掚論の自動的な倱敗に぀ながるべきではないこずを指摘するこず。これを行うには、この芪の抂念をオプションのキヌワヌドでマヌクする必芁がありたす。
  3. そしお第3に、子の抂念のwhereセクションで、この匿名の抂念に察する解決策があるかどうかを確認できたす。


小さな䟋を芋おみたしょう



concept taskAssignedTo (task = t, assignee = u, assigneeName) 
from task t, optional (user where id = t.assignedTo) u 
where assigneeName = if(defined(u), u.firstName + ' ' + u.lastName, 'Unassigned') 
      
      





taskAssignedToコンセプトの属性に は、タスクのオブゞェクト、その゚グれキュヌタヌ、および個別に゚グれキュヌタヌの名前が含たれたす。芪の抂念は タスクず ナヌザヌであり、タスクにただ゚グれキュヌタヌがない堎合、埌者は空にするこずができたす。これは、オプションのキヌワヌドが前に付いた匿名の抂念定矩でラップされおい たす。掚論プロシヌゞャは、最初にタスクコンセプトのオブゞェクトを怜玢し 、次にナヌザヌに基づいお 匿名コンセプトを䜜成し、タスクコンセプトの assignedTo属性の特定の倀に関連付け たす。キヌワヌド オプションは、抂念が倱敗した堎合、そのオブゞェクトが特別な倀UNDEFINEDに関連付けられるこずを掚論ルヌチンに 通知したす。たた、子の抂念レベルで出力の結果を確認するず、assigneeName属性でデフォルト倀を蚭定でき たす。オプションのキヌワヌドが指定されおいない堎合、 匿名の抂念を掚枬できないず、子の抂念怜玢の珟圚のブランチが倱敗したす。これは、SQLの内郚結合に類䌌しおいたす。 匿名抂念のwhere



句の条件に は、他の芪抂念の assignedTo属性が含たれおいるためです。 タスクの堎合、コンセプトナヌザヌのオブゞェクトの怜玢は、 タスクオブゞェクトを倀でバむンドした埌でのみ可胜 です。それらを亀換するこずはできたせん



from optional (user where id = t.assignedTo) u, task t 
      
      





初期段階ではt.assignedToの倀は 䞍明であるため、匿名の抂念の定矩を䜜成するこずはできたせん。



SQLの堎合、fromセクションのテヌブルの順序 重芁ではありたせん。Prologでは、ルヌル内の述語の順序によっお、決定朚をトラバヌスする順序が䞀意に決定されたす。シミュレヌションコンポヌネントに぀いおも同じこずが蚀えたす。シミュレヌションコンポヌネントの出力ルヌルは、Prologで䜿甚されるSLD解像床に基づいおいたす。その䞭で、巊偎の抂念のオブゞェクトの出力の結果は、右偎のオブゞェクトの出力の制限を決定したす。このため、残念ながら、右倖郚結合ず完党倖郚結合の操䜜を同じ自然な方法で実装するこずはできたせん。右の芪抂念の䞀連の結果のカヌディナリティは、巊の抂念の結果よりも倧きくなる可胜性があるため、右の抂念から巊ぞの反察方向に出力する必芁がありたす。残念ながら、遞択した掚論手順の特性により、蚀語の機胜に制限が課せられたす。ただし、完党な倖郚結合操䜜は、内郚を結合するこずで゚ミュレヌトできたす。巊右の組合



concept outerJoinRelation( 
concept1Name, 
concept2Name, 
concept1Key,
concept2Key,
concept1 = c1,
concept2 = c2
) from <concept1Name> c1, <concept2Name> c2
where c1.<concept1Key> = c2.<concept2Key>;

concept outerJoinRelation(
concept1Name, 
concept2Name, 
concept1Key,
concept2Key,
concept1 = c1,
concept2 = null
) from <concept1Name> c1
where not exists( <concept2Name> c2 where c1.<concept1Key> = c2.<concept2Key>);

concept outerJoinRelation(
concept1Name, 
concept2Name, 
concept1Key,
concept2Key,
concept1 = null,
concept2 = c2
) from <concept2Name> c2
where not exists( <concept1Name> c1 where c1.<concept1Key> = c2.<concept2Key>);
      
      





この䞀般化された抂念は、前の蚘事で説明した高階論理を䜿甚しお説明されおい たす。その定矩は3぀の郚分に分かれおいたす。最初のものは抂念の亀差点を芋぀け、2番目は-巊の抂念が持っおいるオブゞェクトず持っおいないオブゞェクト、そしお3番目は-その逆です。各パヌツの名前は同じであるため、それらの掚論の結果が組み合わされたす。



集箄



集玄は、関係代数ず論理プログラミングの䞡方の䞍可欠な郚分です。 SQLでは、 GROUP BY句を䜿甚するず、同じキヌ倀を持぀行をサマリヌ行にグルヌプ化できたす。重耇する倀を削陀するこずができ、sum、 count、 min、 max、 avgなどの集蚈関数で䞀般的に䜿甚され たす。..。行のグルヌプごずに、集蚈関数はそのグルヌプ内のすべおの行に基づいお通垞の倀を返したす。論理プログラミングでは、集玄のセマンティクスはより耇雑です。これは、SLDルヌルの再垰的定矩の堎合によっおは、解決が無限ルヌプに入り、完了できないずいう事実によるものです。倱敗ずしおの拒吊の堎合ず同様に、集玄操䜜での再垰の問題は、氞続的なモデルセマンティクスたたは十分に根拠のあるセマンティクスを䜿甚しお解決されたす。前回の蚘事で、これらのアプロヌチに぀いお簡単に説明しようずしたした 。ただし、モデリングコンポヌネントのセマンティクスは可胜な限り単玔にする必芁があるため、暙準のSLD解像床が掚奚されたす。そしお、無限再垰を回避するずいう問題は、抂念間の接続を再圢成するこずによっおよりよく解決されたす。



集玄は、ハむブリッド蚀語の蚈算コンポヌネントを䜿甚しお、機胜的なスタむルで自然に実装できたす。これを行うには、掚論結果を䞀意のグルヌプにたずめ、それぞれの集蚈関数を蚈算する関数で十分です。しかし、抂念の定矩を論理的な郚分ず機胜的な郚分に分割するこずは、集玄などの重芁なツヌルにずっお最も䟿利な゜リュヌションではありたせん。定矩の構文を拡匵しお、グルヌプ化セクションず集蚈関数を含めるこずをお勧めしたす。



concept < > < > (
    < > = <>,
    ... 
)
group by < >, ... 
from 
    <  > <  > (
        < > = <> ,
        ...
    ),
    ...
where < >
      
      





SQLの堎合ず同様に、group byセクション には、グルヌプ化を実行するための属性のリストが含たれおいたす。関係匏には、集蚈関数を含めるこずもできたす。そのような関数を含む匏は、すべおの芪抂念の倀が芋぀かり、グルヌプ化が実行されるたで、未定矩ず芋なされたす。次に、それらの倀をグルヌプごずに蚈算し、属性に関連付けたり、グルヌプのフィルタリングに䜿甚したりできたす。条件を評䟡およびチェックするためのこの怠惰なアプロヌチでは、グルヌプ化の前埌にフィルタヌ条件を分離するHAVINGセクションは必芁ありたせん 。ランタむムはこれを自動的に行いたす。



䞻な集蚈関数は、 カりント、 合蚈です。、 平均、 最小、 最倧。関数の目的は、その名前から理解できたす。モデリングコンポヌネントは耇合デヌタ型で自然に機胜するため、グルヌプ化された倀をリストずしお返す関数を远加するこずもできたす。それをグルヌプず呌びたしょう 。その入力匕数は匏です。この関数は、グルヌプ内の各芁玠に぀いおこの匏を評䟡した結果のリストを返したす。他の関数ず組み合わせるこずで、任意の集蚈関数を実装できたす。グルヌプ関数 は、group_concatや json_arrayagなどのSQL関数よりも䟿利 です。これは、フィヌルド倀の配列を取埗するための䞭間ステップずしおよく䜿甚されたす。



グルヌプ化の䟋



concept totalOrders (
    customer = c,
    orders = group(o),
    ordersTotal = sum(o.total)
) group by customer
from customer c, order o 
where c.id = o.customerId and ordersTotal > 100
      
      





orders属性 には、すべおのナヌザヌ泚文のリスト、ordersTotalすべおの泚文の合蚈が含たれたす 。グルヌプ化が完了し、合蚈関数が蚈算された埌、ordersTotal> 100条件 がチェックされたす 。



機胜によっお定矩される抂念



抂念を蚘述する宣蚀型の論理圢匏は、必ずしも䟿利ではありたせん。蚈算のシヌケンスを蚭定する方が䟿利な堎合があり、その結果が抂念の本質になりたす。この状況は、デヌタベヌス、ファむル、倖郚サヌビスぞのリク゚ストの送信など、倖郚デヌタ゜ヌスからファクトをロヌドする必芁がある堎合によく発生したす。入力ク゚リをデヌタベヌスぞのク゚リに倉換し、このク゚リの実行結果を返す関数の圢匏で抂念を衚すず䟿利です。論理的な結論を攟棄し、特定の問題の詳现を考慮しおより効率的に解決する特定の実装に眮き換えるこずが理にかなっおいる堎合がありたす。たた、敎数のシヌケンスなど、抂念゚ンティティを生成する無限のシヌケンスを機胜的なスタむルで蚘述する方が䟿利です。



このような抂念を扱う原則は、䞊蚘の他の抂念ず同じである必芁がありたす。゜リュヌションの怜玢は、同じ方法で開始する必芁がありたす。それら自䜓を抂念定矩の芪抂念ずしお䜿甚できたす。゜リュヌションの怜玢の内郚実装のみが異なる必芁がありたす。したがっお、関数を䜿甚しお抂念を定矩する別の方法を玹介したす。



concept < > (
< >, ... 
)
by <  >
      
      





関数を䜿甚しお定矩された抂念を定矩するには、その属性のリストずオブゞェクトを生成するための関数を指定する必芁がありたす。属性のリストを定矩の必須芁玠にするこずにしたした。これにより、そのような抂念の䜿甚が簡単になるためです。その構造を理解するために、オブゞェクトを生成する機胜を調べる必芁はありたせん。



それでは、オブゞェクトを生成するための関数に぀いお説明したしょう。明らかに、入力ずしおリク゚ストを受け取る必芁がありたす-属性の初期倀。これらの倀は指定するこずも指定しないこずもできるため、䟿宜䞊、関数の入力匕数ずなる連想配列に配眮できたす。抂念の意味の怜玢がどのモヌドで開始されるかを知るこずも圹立ちたす-すべおの可胜な倀を芋぀けるか、最初のものだけを芋぀けるか、たたは解決策の存圚だけをチェックしたす。したがっお、2番目の入力匕数ずしお怜玢モヌドを远加したす。



関数を評䟡した結果は、抂念オブゞェクトのリストになりたす。ただし、バックトラッキングを䜿甚した怜玢に基づく掚論手順では、これらの倀が䞀床に1぀ず぀消費されるため、関数の出力匕数をリスト自䜓ではなく、そのむテレヌタヌにするこずができたす。これにより、抂念の定矩がより柔軟になりたす。たずえば、必芁に応じお、遅延評䟡たたはオブゞェクトの無限シヌケンスを実装できたす。暙準コレクションのむテレヌタを䜿甚するこずも、独自のカスタム実装を䜜成するこずもできたす。コレクション芁玠は、コンセプト属性の倀を持぀連想配列である必芁がありたす。コンセプトの゚ッセンスは、それらに基づいお自動的に䜜成されたす。

戻り倀の型ずしおむテレヌタを䜿甚するこずには欠点がありたす。単に結果のリストを返すよりも面倒でナヌザヌフレンドリヌではありたせん。汎甚性、シンプルさ、䜿いやすさを兌ね備えた最適なオプションを芋぀けるこずは、将来の課題です。



䟋ずしお、時間間隔を説明する抂念を考えおみたしょう。就業日を15分間隔に分割したいずしたす。これは、かなり単玔な関数で実行できたす。



concept timeSlot15min (id, hour, minute) by function(query, mode) {
    var timeSlots = [];
    var curId = 1;
    for(var curHour = 8; curHour < 19; curHour += 1) {
        for(var curMinute = 0; curMinute < 60; curMinute += 15) {
            timeSlots.push({
                id: curId,
                hour: curHour,
                minute: curMinute;
            });
            curId++;
        }
    }
    return timeSlots.iterator();
}
      
      





この関数は、営業日の15分間隔のすべおの可胜な倀のむテレヌタヌを返したす。たずえば、ただ予玄されおいない空きスロットを怜玢するために䜿甚できたす。



concept freeTimeSlot is timeSlot15min s where not exists (bookedSlot b where b.id = s.id)
      
      





この関数は、ク゚リク゚リに準拠しおいるかどうかの蚈算結果をチェックしたせん 。これは、属性の配列を゚ンティティに倉換するずきに自動的に行われたす。ただし、必芁に応じお、ク゚リフィヌルドを䜿甚しお関数を最適化できたす。たずえば、抂念のク゚リフィヌルドに基づいおデヌタベヌスク゚リを䜜成したす。



関数を介した抂念は、論理的セマンティクスず機胜的セマンティクスを組み合わせたものです。関数型パラダむムで関数が入力匕数の指定された倀の結果を蚈算する堎合、論理パラダむムでは出力匕数ず入力匕数に分割されたせん。匕数の䞀郚のみを任意の組み合わせで指定でき、関数は残りの匕数の倀を芋぀ける必芁がありたす。実際には、任意の方向で蚈算を実行できるこのような関数を実装できるずは限らないため、自由匕数の可胜な組み合わせを制限するこずは理にかなっおいたす。たずえば、関数を評䟡する前に、いく぀かの匕数を倀にバむンドする必芁があるこずを宣蚀したす。これを行うには、抂念の定矩でそのような属性をキヌワヌドrequiredでマヌクしたす 。



䟋ずしお、特定の指数スケヌルの倀を定矩する抂念を考えおみたしょう。



concept expScale (value, position, required limit) by function(query, mode) {
return {
    _curPos = 0,
    _curValue = 1,
    next: function() {
        if(!this.hasNext()) {
            return null;
        }
        var curItem = {value: this._curValue, position: this._curPosition, limit:  query.limit};
        this._curPos += 1;
        this._curValue = this._curValue * Math.E;
        return curItem;
    },
    hasNext: function() {
        return query.limit == 0 || this._curPos < query.limit; 
    }
}}
      
      





この関数は、遅延評䟡を䜿甚しお抂念゚ンティティを生成するむテレヌタを返したす。シヌケンスのサむズはlimit属性の倀によっお制限されたすが、 れロの堎合は無限倧になりたす。無限シヌケンスに基づく抂念は、掚論ルヌチンが完了するこずを保蚌しないため、非垞に泚意深く䜿甚する必芁がありたす。limit属性 は本質的に補助的なものであり、蚈算を敎理するために䜿甚されたす。他の属性の倀から掚枬するこずはできたせん。蚈算を開始する前に知っおおく必芁があるため、必須ずしおマヌクされたした



関数ずしおの抂念がどのように芋えるかに぀いおのオプションの1぀を怜蚎したした。しかし、そのような抂念の安党性ず䜿いやすさの問題は、将来、より詳现な研究を必芁ずしたす。



ネストされたコレクションのフラット化



オブゞェクト圢匏のデヌタを凊理できる䞀郚のSQLダむアレクトは、コレクションの内容をテヌブル圢匏行セットに倉換し、結果のテヌブルをFROM句に远加する UNNESTなどの操䜜をサポヌトしたす 。これは通垞、ネストされた構造を持぀オブゞェクトをフラット化するため、぀たりオブゞェクトをフラット化たたはフラット化するために䜿甚されたす。そのような蚀語の䟋は、BigQueryやSQL ++です。



ナヌザヌ情報をJSONオブゞェクトずしお保存するずしたす。



[ {
"id":1,
"alias":"Margarita",
"name":"MargaritaStoddard",
"nickname":"Mags",
"userSince":"2012-08-20T10:10:00",
"friendIds":[2,3,6,10],
"employment":[{
    "organizationName":"Codetechno",
    "start-date":"2006-08-06"
},
{
    "organizationName":"geomedia",
    "start-date":"2010-06-17",
    "end-date":"2010-01-26"
}],
"gender":"F"
},
{
"id":2,
"alias":"Isbel",
"name":"IsbelDull",
"nickname":"Izzy",
"userSince":"2011-01-22T10:10:00",
"friendIds":[1,4],
"employment":[{
    "organizationName":"Hexviafind",
    "startDate":"2010-04-27"
}]
}, 

]
      
      





ナヌザヌオブゞェクトは、友人や職堎のリストずずもにネストされたコレクションを栌玍したす。SQL ++ク゚リを䜿甚しお、オブゞェクトの䞊䜍レベルから取埗したナヌザヌに関するデヌタず䞀緒に接着するこずにより、ナヌザヌの職堎に関する添付情報を抜出するこずができたす。



SELECT u.id AS userId, u.name AS userName, e.organizationName AS orgName
FROM Users u UNNEST u.employment e
WHERE u.id = 1;
      
      





結果は次のようになりたす。



[ {
"userId": 1,
"userName": "MargaritaStoddard",
"orgName": "Codetechno"
}, {
"userId": 1,
"userName": "MargaritaStoddard",
"orgName": "geomedia"
} ]
      
      





この操䜜に぀いおは、ここで詳しく説明し たす。



SQLずは異なり、モデリングコンポヌネントでは、埋め蟌たれたデヌタを衚圢匏ではなくオブゞェクト圢匏に倉換する必芁がありたす。䞊で説明した抂念は、これを支揎したす-関数ず匿名の抂念によっお定矩された抂念。関数を介した抂念を䜿甚するず、ネストされたコレクションをオブゞェクト圢匏に倉換できたす。匿名の抂念を䜿甚するず、その定矩を芪抂念のリストに埋め蟌み、目的のネストされたコレクションを含む属性の倀にアクセスできたす。



関数を介した抂念の完党な定矩は、匿名の抂念ずしお䜿甚するには面倒すぎるため、次のようになりたす。



concept conceptName(attribute1, attribute2, ...) by function(query, mode) {...}
      
      





それを短くする方法を芋぀ける必芁がありたす。たず、ク゚リパラメヌタず モヌドパラメヌタを䜿甚しお、関数定矩のタむトルを削陀できたす 。芪コンセプトの䜍眮では、mode匕数 は垞に「すべおのコンセプト倀を怜玢」になりたす。他の抂念の属性ぞの䟝存関係を関数の本䜓に埋め蟌むこずができるため、ク゚リ匕数 は垞に空になりたす。コンセプトキヌワヌドも削陀できたす。したがっお、次のようになりたす。



conceptName(attribute1, attribute2, ...) {
}
      
      





抂念の名前が重芁でない堎合は、省略でき、自動的に生成されたす。



(attribute1, attribute2, ...) {
}
      
      





将来、関数によっお返されるオブゞェクトのタむプから属性のリストを掚枬できるコンパむラを䜜成できる堎合は、属性のリストを砎棄できたす。



{
}
      
      







したがっお、ナヌザヌずその職堎を抂念ずしお䜿甚した䟋は、次のようになりたす。



concept userEmployments (
    userId = u.id,
    userName = u.name,
    orgName = e.orgName
) from users u, {u.employment.map((item) => {orgName: item.organizationName}).iterator()} e
      
      





解決策は少し冗長ですが、普遍的であるこずが刀明したした。同時に、ネストされたコレクションのオブゞェクトの倉換が必芁ない堎合は、倧幅に簡略化できたす。



concept userEmployments (
    userId = u.id,
    userName = u.name,
    orgName = e. organizationName
) from users u, {u.employment.iterator()} e
      
      





調査結果



この蚘事では、2぀の問題に焊点を圓おたした。たず、SQL蚀語の䞀郚の機胜ネストされたク゚リ、倖郚結合、集蚈、ネストされたコレクションずの結合をモデリングコンポヌネントに転送したす。次に、モデリングコンポヌネントぞの2぀の新しい構造の導入抂念の匿名定矩ず関数を通じお定矩された抂念。



匿名の抂念は、抂念定矩の省略圢である関数の匕数ずしお䜿甚するためのもので 芋぀け、 findOneを、そしお 存圚する又はにおけるネストされた抂念の定矩ずしお where句..。これは、関数型プログラミング蚀語の無名関数定矩に類䌌しおいるず考えるこずができたす。



関数によっお定矩される抂念は抂念であり、そのオブゞェクトを生成する方法は、アルゎリズムを䜿甚しお明瀺的な圢匏で衚珟されたす。これは、関数型たたはオブゞェクト指向プログラミングず論理プログラミングの䞖界の間の䞀皮の「むンタヌフェヌス」です。抂念を定矩する論理的な方法が䟿利たたは䞍可胜な堎合、倚くの堎合に圹立ちたす。たずえば、デヌタベヌス、ファむル、たたはリモヌトサヌビスぞの芁求から初期ファクトをロヌドし、ナニバヌサル論理怜玢をその特定のものに眮き換えるなどです。最適化された実装、たたはオブゞェクトを䜜成する任意のルヌルを実装したす。



興味深いこずに、ネストされたク゚リ、倖郚結合、ネストされたコレクション結合などのSQLからの借甚は、モデリングコンポヌネントのロゞックを倧幅に倉曎する必芁がなく、匿名の抂念や関数を介した抂念などの抂念を䜿甚しお実装されたした。これは、これらのタむプの抂念が、優れた衚珟力を備えた柔軟で甚途の広いツヌルであるこずを瀺唆しおいたす。面癜い䜿い方はもっずたくさんあるず思いたす。



そのため、この蚘事ず以前の2぀の蚘事では、ハむブリッドプログラミング蚀語のモデリングコンポヌネントの基本的な抂念ず芁玠に぀いお説明したした。しかし、モデリングコンポヌネントを関数型たたはオブゞェクト指向プログラミングスタむルを実装する蚈算コンポヌネントず統合する問題に進む前に、次の蚘事でそのアプリケヌションの可胜なオプションに専念するこずにしたした。私の芳点からは、モデリングコンポヌネントは、埓来のク゚リ蚀語䞻にSQLに比べお利点があり、蚈算コンポヌネントず深く統合するこずなく単独で䜿甚できたす。これに぀いおは、次の蚘事でいく぀かの䟋を瀺したす。



英語の完党な科孊的テキストは、papers.ssrn.com / sol3 / papers.cfmabstract_id = 3555711で入手できたす。



以前の出版物ぞのリンク



マルチパラダむムプログラミング蚀語の蚭蚈。パヌト1-それは䜕のためですか

マルチパラダむムプログラミング蚀語を蚭蚈したす。パヌト2-PL / SQL、LINQ、GraphQLでの構築モデルの比范

マルチパラダむムプログラミング蚀語 を蚭蚈したす。パヌト3-知識衚珟蚀語の抂芁

マルチパラダむムプログラミング蚀語 を蚭蚈したす。パヌト4-モデリング蚀語の基本構造マルチパラダむムプログラミング蚀語を

蚭蚈したす。パヌト5-論理プログラミングの機胜



All Articles