在OrientDB中如何找到所有由边连接且具有精确属性的节点?

问题描述 投票:0回答:1

我有多项服务,想了解它们如何通过请求链接

所以我创建了边缘作为类“Http”并添加了属性“request”

All services

我有4项服务

  1. 网关
  2. 服务A
  3. 服务B
  4. 服务C

我想显示所有通过边缘链接且属性等于“get_user_info”的服务

网关 -> 服务A -> 服务C -> 服务B

What I would like to see

并且属性等于“delete_user”

网关 -> 服务B

What I would like to see

它可以像“SELECT * FROM Services WHERE edge.request ='get_user_info'”

我试过了

SELECT * 
FROM Services 
WHERE in('http').request = 'get_user_info' OR out('http').request = 'get_user_info'
SELECT expand(in('http')[request='get_user_info']) FROM Services;

但是不起作用

我试过了

select * from `Services` WHERE @rid IN (select in from `http` where request = 'get_user_info') OR @rid IN (select out from `http` where request = 'get_user_info') 

它有效,但我看到从 ServiceB 到网关的链接 我可以过滤该链接吗?

graph-databases orientdb
1个回答
0
投票

还在使用OrientDB?我建议升级到ArcadeDB。

使用您的案例作为 ArcadeDB 的 ruby 接口的测试用例 (https://github.com/topofocus/arcadedb)

基本上,使用 match 语句。它在测试用例的底部编译。

RSpec.describe Arcade::Base do
  before(:all) do
    connect
    db = Arcade::Init.db
    My::V1.create_type
    My::E1.create_type
    db.begin_transaction
    My::V1.delete all: true
    g,a,b,c = ["Gateway", "ServiceA", "ServiceB", "ServiceC"].map {|y| My::V1.insert a: y}
    request='get_user_info'
    g.assign via: My::E1, to: a, request: request  #  create edges
    g.assign via: My::E1, to: b, request: "delete_user"
    a.assign via: My::E1, to: c, request: request
    c.assign via: My::E1, to: b, request: request

  end
  after(:all) do
     db = Arcade::Init.db
     db.rollback
  end

  context "check setup" do

    Given( :gateway  ){ My::V1.find a: 'Gateway' }
    Then { gateway.out.size == 2 }
    When ( :deleted_service ){ My::V1.where a: 'ServiceB' }
    When ( :request_service ){ My::V1.where a: 'ServiceA' }
    Then { gateway.nodes( :outE, where: { request: "delete_user" }) == deleted_service }
    Then { gateway.nodes( :outE, where: { request: "get_user_info" }) == request_service }

  end

  context "get deleted User relation" do
    Given( :gateway_record ){ Arcade::Match.new type: My::V1, where:{ a: 'Gateway' }, as: :g }
    Given( :gateway  ){ My::V1.where a: 'Gateway' }
    Given ( :deleted_service ){ My::V1.where a: 'ServiceB' }
    Then  { gateway_record.to_s == "MATCH { type: my_v1, where: ( a='Gateway' ), as: g } RETURN g " }
    Then  { gateway_record.execute.select_result ==  gateway}

    Given( :deleted_user_record  ){ gateway_record.outE( My::E1,  where: { request: 'delete_user' }).node(as: :f) }
    Then { deleted_user_record.to_s == "MATCH { type: my_v1, where: ( a='Gateway' ), as: g }.outE('my_e1'){ where: ( request='delete_user' ) }.inV(){ as: f } RETURN g,f " }
    Then { deleted_user_record.execute.allocate_model  ==   gateway + deleted_service }
  end

end

© www.soinside.com 2019 - 2024. All rights reserved.