2

私は自分のデータを AreangoDB に与えられた形式で保存し、DSP に私のコレクション名を保存しました:

 "data": {
"1":   [ {"db_name": "DSP"}, {"rel": "2"} ], 
"2":   [ {"rel_name": "DataSource"}, {"tuple": "201"}, {"tuple": "202"}, {"tuple": "203"} ],
"201": [ {"src_id": "Pos201510070"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151007"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "postgres"}, {"port": "None"} ],
"202": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"},{"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "DSP"}, {"port": "5432"} ],
"203": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"},{"src_type": "Structured"},{"db_name": "maindb"},{"port": "5432"} ]
}

上記のデータを次の形式で使用してクエリを実行しています。

  FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p) 
  FOR attribute IN attributes 
      LET key = ATTRIBUTES(attribute)[0] 
      LET value = attribute[key] 
      RETURN { subject: attribute, predicate: key, object: value }

クエリを ArangoDB に送信すると、次のような応答が返されます。

    Warnings:

[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''
[1542], 'invalid argument type in call to function 'ATTRIBUTES()''

Result:

[
  {
    "subject": "data",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_id",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_rev",
    "predicate": null,
    "object": null
  },
  {
    "subject": "_key",
    "predicate": null,
    "object": null
  }
]

このクエリの問題点と、答えが上記のような理由を教えてください..私は ArangoDB-2.7.3-win64 で作業しています。

ありがとう

4

1 に答える 1

3

ネストされたデータ構造を深く掘り下げるような複雑なクエリを構築する方法を示しましょう。内側の結果を得るために、クエリの外側の部分を取得することから始めます。

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p) 
  FOR attribute IN attributes 
      RETURN attribute

それは私に与える:

[ 
  "data", 
  "_rev", 
  "_key", 
  "_id" 
]

それでは、次のレイヤーをさらに深く掘り下げてみましょう。dataキーの下にある値だけに興味があると思いますよね?だから私たちは選ぶp.data

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR attribute IN attributes 
      RETURN attribute

これにより、次の内部配列のキーが得られます。

[ 
  "203", 
  "202", 
  "201", 
  "2", 
  "1" 
]

次に、これらのノードに接続されていることがわかったものを調べます。

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
      RETURN keys

これも配列で、FORキーのループを使用して反復処理する必要があります。

[
  [ 
    { 
      "src_id" : "pos201510060" 
    }, 
    { 
      "src_name" : "Postgres" 
    }, ...

この追加FORのループを追加します。

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
    FOR key IN keys
      RETURN key

最も内側のオブジェクトを取得します。

[ 
  { 
    "src_id" : "pos201510060" 
  }, 
  { 
    "src_name" : "Postgres" 
  }, 
  { 
    "password" : "root" 
  }, 
...

関数を使用したかったATTRIBUTESのですが、オブジェクトにはメンバーが 1 つしかないため、次のようにアクセスできます[0]

FOR p IN NestedDSP
  LET attributes = ATTRIBUTES(p.data) 
  FOR oneAttribute IN attributes 
    LET keys = p.data[oneAttribute]
    FOR key IN keys
      LET keyAttributes=ATTRIBUTES(key)
        RETURN keyAttributes

これにより、最も内側のオブジェクトごとに 1 つのオブジェクト キーが得られます。

[ 
  [ 
    "src_id" 
  ], 
  [ 
    "src_name" 
  ], 

最も内側の構造のオブジェクト キーのみを取得するかどうかを調べます。上記よりも少し賢い変数名を選択します。

  FOR p IN NestedDSP
    LET attributes = ATTRIBUTES(p.data) 
    FOR oneAttribute IN attributes 
      LET pairs = p.data[oneAttribute]
      FOR onePair IN pairs
        LET pairKey=ATTRIBUTES(onePair)[0]
          RETURN pairKey

はい:

[ 
  "src_id", 
  "src_name", 
  "password", 
  "host", 
    ...

それでは、必要に応じて結果オブジェクトを作成します。

  FOR p IN NestedDSP
    LET attributes = ATTRIBUTES(p.data) 
    FOR oneAttribute IN attributes 
      LET pairs = p.data[oneAttribute]
      FOR onePair IN pairs
        LET pairKey=ATTRIBUTES(onePair)[0]
          RETURN { subject: oneAttribute, predicate: pairKey, object: onePair[pairKey] }

subject最も外側の項目を識別する番号、predicateはオブジェクト キー、objectはその中の値です。

[ 
  { 
    "subject" : "203", 
    "predicate" : "src_id", 
    "object" : "pos201510060" 
  }, 
  { 
    "subject" : "203", 
    "predicate" : "src_name", 
    "object" : "Postgres" 
  }

うまくいけば、あなたが望んでいたものはどれですか?

于 2016-06-20T16:17:12.530 に答える