2016-06-01 16 views
1

私はクラスNodeがVを拡張しています。いくつかのドキュメントタイプ情報が提供されたNodeをインスタンスに追加します。私は、OrientDBデータベースにクエリを行い、Nodeからいくつかの情報を返したいと思います。これをフォーマットされた方法で表示するには、可能なすべてのフィールド名のリストが必要です(私のアプリケーションでは、現在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コマンドのどちらかを使ってこれを行う簡単な方法はありますか?

+0

こんにちは@kingledion、あなたはクラスのすべてのフィールドの名前のリストを取得したいですか?それともその価値ですか? – LucaS

+0

名前のリストは、 – kingledion

答えて

1

私はこのデータセットを使用してケースを試してみました:

enter image description here

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

enter image description here

あなたが唯一の私の構造から見ることができるようにname,surnametimeStampschema-lessモードでDBに挿入された代わりnameSchemaLess1nameSchemaLess1schema-fullモードで作成されました。 (hereが説明したように)あなたがOrientDB StudioまたはコンソールでのJavascript機能を作成することができ、その後、あなたがSQLコマンドを使用してpyOrientからそれを思い出すことができることを行わした後

次投稿機能が重複することなく、クラス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 

、取り出されました。

希望します。

+0

の下で行ったように、こんにちは@kingledion、私の答えは正しいですか? – LucaS

+0

答えLucaに感謝します。私は以下のように使った。私はUNWINDをなぜ使用したのか尋ねたいと思いますか?巻き戻しを使用しない場合は、pyorientのデータを辞書エントリとして取得します。このエントリは1つのチャンクで取り出すことができます。反復処理を行うために余分なリストを作成するよりも、それは望ましいことではありませんか? – kingledion

+1

こんにちは@kingledion、投票していただきありがとうございます。私は 'UNWIND'を使って、異なるフィールドの全てを非リスト出力として取り出すようにしました(私は誰かが** ODB Studio **、** Console **、ecc ..でクエリを実行したいと思っていました。あなたはあなたがより良く信じている方法でそれを変えることができます。うれしいことはうれしいです。 – LucaS

1

ルカの答えが働いた。私はそれを自分の好み/ニーズに合わせて修正しました。 Stack Exchange上のOrientDBドキュメントの量を増やすためにここに投稿してください。私はルカの答えを取り、それをグルーヴィーに翻訳した。また、フィールドを取得するクラスを選択するためのパラメータを追加し、結果内のUNWINDを削除しました。私が学ぶ手助けをしてくれたLucaに感謝します。データベース接続を削除するpyorient部分については

g = orient.getGraph() 
fieldList = [] as Set 
ret = g.command("sql", "SELECT FROM " + class_name) 

for (record in ret) { 
    fieldList.addAll(record.getRecord().fieldNames()) 
} 
return fieldList 

、それは次のようになります:

1つのパラメータ(CLASS_NAME)との関数getFieldListのためのGroovyコードにクラス名に

node_keys = {} 
ret = client.command("SELECT getFieldList({0})".format("'Node'")) 
node_keys = ret[0].oRecordData['getFieldList'] 

特別予告; client.command()に渡される文字列では、パラメータを引用符で囲む必要があります。

関連する問題