查找无模式顶点的所有属性 class

Finding all properties for a schema-less vertex class

我有一个 class Node extends V。我将实例添加到 Node 并提供一些文档类型信息。我想查询 OrientDB 数据库和 return 来自 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()

我通过反复试验得出了很多结论。它不是很有效或优雅。肯定有办法让数据库 return 成为 class 或任何其他文档类型对象的所有可能字段的列表。有没有一种简单的方法可以通过 pyorient 或 SQL 命令来做到这一点?

我用这个数据集试过你的案例:

这是我的 class TestClass:

的结构

从我的结构可以看出只有namesurname timeStamp 已在 schema-full 模式下创建,而不是 nameSchemaLess1nameSchemaLess1 已以 schema-less 模式插入到数据库中。

完成后,您可以在 OrientDB Studio 或控制台中创建一个 Javascript 函数 (如 here 所述),随后您可以调用它从 pyOrient 使用 SQL 命令。

以下发布的函数检索 class 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;

py东方编码:

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

如您所见,已检索到所有字段名称,包括全模式和无模式。

希望对您有所帮助

Luca 的回答有效。我修改了它以适合我的 tastes/needs。在此处发布以增加 Stack Exchange 上 OrientDB 文档的数量。我把 Luca 的回答翻译成了 groovy。我还向 select 添加了一个参数 class 以获取字段并删除了结果中的 UNWIND。感谢 Luca 帮助我学习。

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

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']

特别通知class姓名;在传递给 client.command() 的字符串中,参数必须用引号括起来。