简体   繁体   English

在OrientDB中,如何获取所有顶点为JSON并排除结果中的边

[英]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类的东西?

  1. How do I eliminate the in/out/in_belongsTo/out_belongsTo from the result? 如何从结果中消除in / out / in_belongsTo / out_belongsTo?

  2. 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 , 第二部分

  1. If you want to load tree by depth then the value of depth can be specified by giving input like [0-2] , -1 will load entire tree recursively 如果要按深度加载树,则可以通过提供[0-2]之类的输入来指定depth的值,-1将递归加载整个树

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM