1

我有一个类 Node extends V。我将实例添加到 Node 并提供了一些文档类型信息。我想查询OrientDB数据库并从Node返回一些信息;要以格式化的方式显示它,我想要一个所有可能字段名称的列表(在我的应用程序中,当前有 115 个字段名称,其中只有一个是用作索引的属性)

要在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

在此处输入图像描述

正如您仅从我的结构中看到的那样namesurname并且timeStamp已在模式下创建,schema-full而是以模式插入到数据库中。nameSchemaLess1nameSchemaLess1schema-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 回答
1

卢卡的回答奏效了。我修改它以适应我的口味/需求。在此处发布以增加 Stack Exchange 上的 OrientDB 文档数量。我接受了卢卡的回答并将其翻译成 groovy。我还添加了一个参数来选择要获取字段的类,并在结果中删除了 UNWIND。感谢卢卡帮助我学习。

带有 1 个参数(class_name)的函数 getFieldList 的 Groovy 代码:

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

对于 pyorient 部分,删除数据库连接如下所示:

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

特别注意类名;在传递给 client.command() 的字符串中,参数必须用引号引起来。

于 2016-06-07T16:30:51.297 回答