1

クラス Node が V を拡張しています。提供された一連のドキュメント タイプ情報を使用してインスタンスを Node に追加します。OrientDB データベースにクエリを実行し、ノードからいくつかの情報を返したいと考えています。これをフォーマットされた方法で表示するには、考えられるすべてのフィールド名のリストが必要です (私のアプリケーションでは、現在 115 のフィールド名があり、そのうちの 1 つだけがインデックスとして使用されるプロパティです)。

これをpyorientで行うには、これまでに見つけた唯一の解決策は次のとおりです(クライアントはデータベースハンドルの名前です):

count = client.query("SELECT COUNT(*) FROM Node")[0].COUNT
node_records = client.query("SELECT FROM Node LIMIT {0}".format(count))
node_key_list = set([])
for node in node_records:
   node_key_list |= node.oRecordData.keys()

試行錯誤を重ねて大体のことは分かってきました。あまり効率的でもエレガントでもありません。確かに、クラスまたはその他の文書型オブジェクトのすべての可能なフィールドのリストをデータベースに返させる方法が必要です。pyorient または SQL コマンドを使用してこれを行う簡単な方法はありますか?

4

2 に答える 2

1

私はこのデータセットであなたのケースを試しました:

ここに画像の説明を入力

そして、これは私のクラスの構造ですTestClass:

ここに画像の説明を入力

私の構造からわかるようにname、モードで作成され、代わりに モードでDBに挿入されていsurnameます。timeStampschema-fullnameSchemaLess1nameSchemaLess1schema-less

それを行った後、OrientDB Studio または Console でJavascript 関数を作成し (ここでpyOrient説明されているように)、その後、コマンドを使用して呼び出すことができますSQL

TestClass次の投稿された関数は、クラスのすべてのフィールド名を重複なしで取得します。

Javascript 関数:

var g = orient.getGraph();

var fieldsList = [];
var query = g.command("sql", "SELECT FROM TestClass");
for (var x = 0; x < query.length; x++){
  var fields = query[x].getRecord().fieldNames();
  for (var y = 0; y < fields.length; y++) {
    if (fieldsList == false){
      fieldsList.push(fields[y]);
    } else {
      var fieldFound = false;
      for (var z = 0; z < fieldsList.length; z++){
        if (fields[y] == fieldsList[z]){
          fieldFound = true;
          break;
        }
      }
      if (fieldFound != true){
        fieldsList.push(fields[y]);
      }
    }
  }
}
return fieldsList;

pyOrient コード:

import pyorient


db_name = 'TestDatabaseName'

print("Connecting to the server...")
client = pyorient.OrientDB("localhost", 2424)
session_id = client.connect("root", "root")
print("OK - sessionID: ", session_id, "\n")

if client.db_exists(db_name, pyorient.STORAGE_TYPE_PLOCAL):
    client.db_open(db_name, "root", "root")
    functionCall = client.command("SELECT myFunction() UNWIND myFunction")
    for idx, val in enumerate(functionCall):
        print("Field name:  " + val.myFunction)

client.db_close()

出力:

Connecting to the server...
OK - sessionID:  54 

Field name:  name
Field name:  surname
Field name:  timeStamp
Field name:  out_testClassEdge
Field name:  nameSchemaLess1
Field name:  in_testClassEdge
Field name:  nameSchemaLess2

ご覧のとおり、スキーマフルとスキーマレスの両方のすべてのフィールド名が取得されています。

それが役に立てば幸い

于 2016-06-01T23:45:16.173 に答える