查找无模式顶点的所有属性 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
:
的结构
从我的结构可以看出只有name
、surname
和 timeStamp
已在 schema-full
模式下创建,而不是 nameSchemaLess1
和 nameSchemaLess1
已以 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() 的字符串中,参数必须用引号括起来。
我有一个 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
:
从我的结构可以看出只有name
、surname
和 timeStamp
已在 schema-full
模式下创建,而不是 nameSchemaLess1
和 nameSchemaLess1
已以 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() 的字符串中,参数必须用引号括起来。