[英]In OrientDB, how do I get all verticies as JSON and exclude edges in results
TRAVERSE vs fetchPlan TRAVERSE与fetchPlan
I've got a graph (my example is a balanced tree) where I want to generate a JSON structure representing the tree. 我有一个图(我的示例是平衡树),我想在其中生成表示树的JSON结构。
Here's how I generate my database for testing: 这是我生成数据库进行测试的方式:
I have two files, one for the schema and one for data. 我有两个文件,一个用于模式,一个用于数据。 Here's the FetchPlanTestingCreateSchema.sql file contents:
这是FetchPlanTestingCreateSchema.sql文件的内容:
SET ignoreErrors true;
DROP DATABASE remote:localhost/FetchPlanTesting admin admin;
SET ignoreErrors false;
CREATE DATABASE remote:localhost/FetchPlanTesting admin admin plocal graph;
CREATE CLASS Level01 extends V;
CREATE CLASS Level02 extends V;
CREATE CLASS Level03 extends V;
CREATE CLASS Level04 extends V;
CREATE CLASS Level05 extends V;
CREATE CLASS Level06 extends V;
CREATE CLASS Level07 extends V;
CREATE CLASS Level08 extends V;
CREATE CLASS Level09 extends V;
CREATE CLASS belongsTo extends E;
Here is the FetchPlanTestingData.sql. 这是FetchPlanTestingData.sql。 For brevity, I'm showing 3 levels being created (01, 02, and 03), in my testing though, I've got all 9 levels populated so I can test various
$depth
settings: 为简便起见,我在测试中显示了正在创建的3个级别(01、02和03),我已经填充了所有9个级别,因此可以测试各种
$depth
设置:
CREATE VERTEX Level01 SET name = 'Item01_at_Level01';
CREATE VERTEX Level01 SET name = 'Item02_at_Level01';
CREATE VERTEX Level02 SET name = 'Item01_at_Level02';
CREATE EDGE belongsTo FROM (SELECT FROM Level02 WHERE name = 'Item01_at_Level02') TO (SELECT FROM Level01 WHERE name = 'Item02_at_Level01');
CREATE VERTEX Level02 SET name = 'Item02_at_Level02';
CREATE EDGE belongsTo FROM (SELECT FROM Level02 WHERE name = 'Item02_at_Level02') TO (SELECT FROM Level01 WHERE name = 'Item01_at_Level01');
CREATE VERTEX Level02 SET name = 'Item03_at_Level02';
CREATE EDGE belongsTo FROM (SELECT FROM Level02 WHERE name = 'Item03_at_Level02') TO (SELECT FROM Level01 WHERE name = 'Item02_at_Level01');
CREATE VERTEX Level02 SET name = 'Item04_at_Level02';
CREATE EDGE belongsTo FROM (SELECT FROM Level02 WHERE name = 'Item04_at_Level02') TO (SELECT FROM Level01 WHERE name = 'Item01_at_Level01');
CREATE VERTEX Level03 SET name = 'Item01_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item01_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item02_at_Level02');
CREATE VERTEX Level03 SET name = 'Item02_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item02_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item03_at_Level02');
CREATE VERTEX Level03 SET name = 'Item03_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item03_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item04_at_Level02');
CREATE VERTEX Level03 SET name = 'Item04_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item04_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item01_at_Level02');
CREATE VERTEX Level03 SET name = 'Item05_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item05_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item02_at_Level02');
CREATE VERTEX Level03 SET name = 'Item06_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item06_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item03_at_Level02');
CREATE VERTEX Level03 SET name = 'Item07_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item07_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item04_at_Level02');
CREATE VERTEX Level03 SET name = 'Item08_at_Level03';
CREATE EDGE belongsTo FROM (SELECT FROM Level03 WHERE name = 'Item08_at_Level03') TO (SELECT FROM Level02 WHERE name = 'Item01_at_Level02');
I create the DB/Schema by passing running /opt/orientdb-community/bin/console.sh 'cat FetchPlanTestingCreateSchema.sql FetchPlanTestingData.sql'
我通过传递运行
/opt/orientdb-community/bin/console.sh 'cat FetchPlanTestingCreateSchema.sql FetchPlanTestingData.sql'
创建数据库/模式/opt/orientdb-community/bin/console.sh 'cat FetchPlanTestingCreateSchema.sql FetchPlanTestingData.sql'
Using TRAVERSE, I get a "flat" list of records and it excludes any of the belongsTo
edges: 使用TRAVERSE,我得到了一个“平坦”的记录列表,它排除了任何
belongsTo
边:
SELECT * FROM (TRAVERSE * FROM (SELECT FROM Level01 WHERE name = 'Item01_at_Level01') WHILE $depth<=2) WHERE @class <> 'belongsTo' LIMIT 1000
orientdb {db=FetchPlanTesting}> SELECT * FROM (TRAVERSE * FROM (SELECT FROM Level01 WHERE name = 'Item01_at_Level01') WHILE $depth<=2) WHERE @class <> 'belongsTo' LIMIT 1000
----+-----+-------+-----------------+------------+-------------
# |@RID |@CLASS |name |in_belongsTo|out_belongsTo
----+-----+-------+-----------------+------------+-------------
0 |#11:0|Level01|Item01_at_Level01|[size=2] |null
1 |#12:1|Level02|Item02_at_Level02|[size=2] |[size=1]
2 |#12:3|Level02|Item04_at_Level02|[size=2] |[size=1]
----+-----+-------+-----------------+------------+-------------
3 item(s) found. Query executed in 0.006 sec(s).
Yay! 好极了! I can get traverse the records.
我可以遍历记录。 However, with that result, I'd have to build my nested JSON manually.
但是,要获得该结果,我将不得不手动构建嵌套的JSON。 Seems to defeat the purpose of using a Graph DB Engine.
似乎无法达到使用Graph DB Engine的目的。
Using a fetchPlan, I'm getting closer, but still not quite what I want. 使用fetchPlan,我越来越近了,但仍然不是我想要的。
orientdb {db=FetchPlanTesting}> SELECT @this.toJSON('fetchPlan:*:-1') FROM (SELECT FROM Level01 WHERE name = 'Item01_at_Level01')
----+------+----------------------------------------------------------------------------------------------------------------------------------
# |@CLASS|this
----+------+----------------------------------------------------------------------------------------------------------------------------------
0 |null |{"name":"Item01_at_Level01","in_belongsTo":[{"out":{"name":"Item02_at_Level02","in_belongsTo":[{"out":{"name":"Item01_at_Level0...
----+------+----------------------------------------------------------------------------------------------------------------------------------
1 item(s) found. Query executed in 0.112 sec(s).
That gives me EVERYTHING in the tree. 那给了我一切在树上。 Here's my remaining questions.
这是我剩下的问题。 1. How do I limit to something like
$depth<=2
? 1.如何限制为
$depth<=2
类的东西?
How do I eliminate the in/out/in_belongsTo/out_belongsTo from the result? 如何从结果中消除in / out / in_belongsTo / out_belongsTo?
Can I use a different approach and only include certain classes? 我可以使用其他方法,只包含某些类吗?
Here's that JSON in a more readable format using fetchplan:*:5
instead of `fetchplan:*:-1': 这是使用
fetchplan:*:5
而不是`fetchplan:*:-1'的更具可读性的JSON格式:
SELECT @this.toJSON('fetchPlan:*:5') FROM (SELECT FROM Level01 WHERE name = 'Item01_at_Level01')
{
"in_belongsTo": [
{
"in": "#11:0",
"out": {
"in_belongsTo": [
{
"in": "#12:1",
"out": {
"in_belongsTo": [
{
"in": "#13:0",
"out": "#14:7"
},
{
"in": "#13:0",
"out": "#14:15"
}
],
"name": "Item01_at_Level03",
"out_belongsTo": [
"#20:4"
]
}
},
{
"in": "#12:1",
"out": {
"in_belongsTo": [
{
"in": "#13:4",
"out": "#14:3"
},
{
"in": "#13:4",
"out": "#14:11"
}
],
"name": "Item05_at_Level03",
"out_belongsTo": [
"#20:8"
]
}
}
],
"name": "Item02_at_Level02",
"out_belongsTo": [
"#20:1"
]
}
},
{
"in": "#11:0",
"out": {
"in_belongsTo": [
{
"in": "#12:3",
"out": {
"in_belongsTo": [
{
"in": "#13:2",
"out": "#14:1"
},
{
"in": "#13:2",
"out": "#14:9"
}
],
"name": "Item03_at_Level03",
"out_belongsTo": [
"#20:6"
]
}
},
{
"in": "#12:3",
"out": {
"in_belongsTo": [
{
"in": "#13:6",
"out": "#14:5"
},
{
"in": "#13:6",
"out": "#14:13"
}
],
"name": "Item07_at_Level03",
"out_belongsTo": [
"#20:10"
]
}
}
],
"name": "Item04_at_Level02",
"out_belongsTo": [
"#20:3"
]
}
}
],
"name": "Item01_at_Level01"
}
I'd really like to get the nested structure (say level 1 and 2) and have the resulting JSON look like this: 我真的很想获得嵌套的结构(例如1级和2级),并使生成的JSON看起来像这样:
{
"Level02": [
{
"name": "Item02_at_Level02",
},
{
"name": "Item04_at_Level02", }
}
],
"name": "Item01_at_Level01"
}
Even better would be this type of structure: 更好的是这种类型的结构:
{
"Level01": [
{
"name": "Item01_at_Level01",
"Level02": [
{
"name": "Item02_at_Level02",
"Level03": [
{
"name": "Item01_at_Level03",
},
{
"name": "Item05_at_Level03",
}
]
},
{
"name": "Item04_at_Level02",
"Level03": [
{
},
{
}
]
}
]
}
]
}
Essentially, JSON where the class is the key and then there's a nested structure for each class which is connected and don't include any in/out edge information. 本质上是JSON,其中的类是键,然后每个连接的类都有一个嵌套结构,并且不包含任何入/出边缘信息。
For first part of your question , you can get the $depth value from traversal query and write logic to form a tree from the depth 对于问题的第一部分,您可以从遍历查询中获取$ depth值,并编写逻辑以从该深度形成一棵树
For second part , 第二部分
2.You can skip in edges by adding [ * ]in_*:-2 to the fecth plan but out will be there 2.您可以通过在病案计划中添加[*] in _ *:-2来跳过边缘,但在那里
Example : 范例:
select @this.toJSON("fetchPlan:[ * ]in_ :-2 out_ :-1 ") FROM rid 从rid选择@ this.toJSON(“ fetchPlan:[*] in_ :-2 out_ :-1”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.