1

こんにちは、まずXQueryの質問を読んでいただきありがとうございます。

データ構造内のアイテムを順番に検出する関数をXQueryに実装する必要があります。私はXQueryを初めて使用するので、まだなじみのないいくつかの概念を見つけており、XQUery/Saxonでの数週間と比較して長年の経験を持つ皆さんの助けに大いに感謝しています。

これはログファイル分析の一部であり、関連するデータを、XQueryモジュールに順番に保持されるよりコンパクトなXML構造(以下を参照)にまとめました。次に、このシーケンスを、データ内の特定のイベントを検出する関数に渡す必要があります。私の構造は次のとおりです:-

<SEQUENCE><TIME>0.01</TIME><TAG>2100</TAG><FIELD>PRIMARY_MODE_CMD</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>0.57</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>0.65</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>1.29</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>1.94</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>2.57</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>3.01</TIME><TAG>3800</TAG><FIELD>JAT_INITIALISE_CMD</FIELD><MODE>UPDATE_JAT_INITIALISE_PARAMS</MODE></SEQUENCE>
<SEQUENCE><TIME>3.03</TIME><TAG>2900</TAG><FIELD>PRIMARY_MODE_CNF</FIELD><MODE>MODE1</MODE></SEQUENCE>
<SEQUENCE><TIME>3.03</TIME><TAG>2900</TAG><FIELD>INVALID_CMD_CNF</FIELD><MODE>INVALID</MODE></SEQUENCE>

XQuery関数(例:'* describe function local:analyse_case_1($ seq as element())as xs:boolean ')は、要素のシーケンス全体(上記)をパラメーターとして受け取り、3つのイベントが見つかった場合は'true'を返す必要があります。厳密な順序、すなわち:

'2100 + PRIMARY_MODE_CMD + MODE1' - followed by:
'2900 + PRIMARY_MODE_CNF + MODE1' - followed by:
'3800 + JAT_INITIALISE_CMD + UPDATE_JAT_INITIALISE_PARAMS' - followed by:
'2900 + INVALID_CMD_CNF + INVALID'

この順序が正しくない、アイテムが不足しているなどの場合、関数はfalseを返します。2番目の要件として、これらのアイテム間の時間が0.60より長い場合もfalseを返す必要があります。

過去1日ほどXQueryを詳細に調べたので、これはコンパイル型言語で簡単に実現できたと思いますが、何らかの理由でXQueryをすぐに使用する方法がわかりません。誰かが私を正しい方向に向けてくれることを願っていますか?

感謝を込めて。

4

2 に答える 2

1

あなたの要件は、順番に並んでいるが必ずしも隣接しているとは限らないメッセージを見つけることだという印象を受けます。これは、フォームのクエリによって実現できます

exists(
  SEQUENCE[TAG='2100' and FIELD='PRIMARY_MODE_CMD' and MODE='MODE1']
  /following-sibling::SEQUENCE[TAG='2900' and FIELD='PRIMARY_MODE_CNF' and MODE='MODE1']
  /following-sibling::SEQUENCE[TAG='3800' and FIELD='JAT_INITIALISE_CMD' and MODE='UPDATE_JAT_INITIALISE_PARAMS']
  /following-sibling::SEQUENCE[TAG='2900' and FIELD='INVALID_CMD_CNF' and MODE='INVALID'])

質問の2番目の部分、

it should also return false if the time between these items is longer than 0.60

明確に指定されていません。最初と最後の間の時間、またはイベントの任意のペアの間の時間を意味しますか?基本的に、選択した要素に変数をバインドすることでこれを処理できます。

let $x := SEQUENCE[...],
    $y := $x/following-sibling[...],
    $z := $y/following-sibling[...][TIME lt $x/TIME + 0.6]
return exists($z)
于 2012-09-11T11:44:39.780 に答える
0

構成はあなたのfor $x at $pos in $seq友達です:

for $x at $pos in $seq
  where $x/TAG eq "2100"
    and $x/FIELD eq "PRIMARY_MODE_CMD"
    and (some $y in subsequence($seq, $pos, count($seq))
           satisfies ($y/TAG eq "2900" and $y/FIELD eq "PRIMARY_MODE_CNF"))
  return $x

これはまだ完全なクエリではありませんが、ここから開始できるはずです。実際には、これをいくつかの関数に変換します。ループ内の呼び出しは、最悪の場合、subsequenceこのクエリにO(n²)時間がかかることを意味することに注意してください。

于 2012-09-11T08:28:02.527 に答える