OrientDB SQL检查是否连接了多对顶点

OrientDB SQL检查是否连接了多对顶点,orientdb,Orientdb,我还没有找到这个SQL的答案 给定顶点对记录它们之间的ID和边类型,我想检查是否所有对都存在 V1-E1->V2 V3-E2->V4 。。。等等我想要的答案是真/假或类似的。必须存在所有连接才能计算为真,因此每对连接必须至少存在一条正确类型的边 因此,问题是: Does V1 have edge <E1EdgeType> to V2? AND Does V3 have edge <E2EdgeType> to V4? AND ... and so on 如果在12:0到

我还没有找到这个SQL的答案

给定顶点对记录它们之间的ID和边类型,我想检查是否所有对都存在

V1-E1->V2

V3-E2->V4

。。。等等我想要的答案是真/假或类似的。必须存在所有连接才能计算为真,因此每对连接必须至少存在一条正确类型的边

因此,问题是:

Does V1 have edge <E1EdgeType> to V2?
AND
Does V3 have edge <E2EdgeType> to V4?
AND
... and so on
如果在12:0到12:1之间存在“TestEdge”类型的边,则这将返回目标记录12:0。但是,如果我有其中两个,我如何为两个查询查询一个结果。比如:

SELECT <something with $c> LET
    $a = (SELECT FROM (SELECT EXPAND(out('TestEdge')) FROM #12:0) WHERE @rid=#12:1)
    $b = (SELECT FROM (SELECT EXPAND(out('AnotherTestEdge')) FROM #12:2) WHERE @rid=#12:3)
    $c = <something that checks that both a and b yield results>

这就是我的目标。请告诉我我是否用错误的方法解决了这个问题。与重复查询相比,我甚至不确定合并这样的查询有什么好处。

给定一对顶点,比如11:0和12:0,下面的查询将有效地检查是否存在11:0的E类型边 到12:0

这是非常不雅观的,我鼓励您考虑在

下面举例说明了一种合并您心目中的布尔测试的方法:

select from 
  (select $a.size() as a, $b.size() as b
   let a=(select count(*) as e from (select out(E) from #11:0 unwind out)
                                     where out = #12:0),
       b=(select count(*) as e from (select out(E) from #11:1 unwind out)
                                     where out = #12:2))
where a > 0 and b > 0

是的,再次不美观:-

给定一对顶点,例如11:0和12:0,下面的查询将有效地检查是否存在11:0的E类型边 到12:0

这是非常不雅观的,我鼓励您考虑在

下面举例说明了一种合并您心目中的布尔测试的方法:

select from 
  (select $a.size() as a, $b.size() as b
   let a=(select count(*) as e from (select out(E) from #11:0 unwind out)
                                     where out = #12:0),
       b=(select count(*) as e from (select out(E) from #11:1 unwind out)
                                     where out = #12:2))
where a > 0 and b > 0

是的,还是不雅:-

下面的查询可能对您有用

SELECT eval('sum($a.size(),$b.size())==2') as existing_edges
let $a = ( SELECT from TestEdge where out = #12:0 and in = #12:1 limit 1),
    $b = ( SELECT from AnotherTestEdge where out = #12:2 and in = #12:3 limit 1)

希望有帮助。

下面的查询可能对您有用

SELECT eval('sum($a.size(),$b.size())==2') as existing_edges
let $a = ( SELECT from TestEdge where out = #12:0 and in = #12:1 limit 1),
    $b = ( SELECT from AnotherTestEdge where out = #12:2 and in = #12:3 limit 1)

希望有帮助。

也许你可以尝试使用javascript函数?也许你可以尝试使用javascript函数?非常感谢你的示例!是否有可能将其塑造成一个更像真/假的结果和/或将其合并到两个或多个您所做的示例查询中。我知道如何使用LET合并查询,我只是不知道如何处理查询结果,我需要查看每个查询是否需要返回true,即每个查询需要成功检查顶点之间是否存在边,同时我需要确保每个查询都成功找到一条边,以确保整个查询返回事实上,我有另一种方法可以找到它,这与你的有点相似,我会用它更新我的问题,如果你有意见,哪一个更好,请告诉我。但是我仍然不知道如何修改返回数据,以便能够同时对多个查询结果进行逻辑检查。这也是一个解决办法。还可以使用$a.size.asBoolean将大小转换为布尔值。结果仍然是一系列布尔值。不过,也有一些技巧可以将其压缩为一个布尔值,如标记的答案所示。我同意如果能有更简单的方法来做这件事会很好。最好是内置函数,因为它感觉非常有用。非常感谢这个例子!是否有可能将其塑造成一个更像真/假的结果和/或将其合并到两个或多个您所做的示例查询中。我知道如何使用LET合并查询,我只是不知道如何处理查询结果,我需要查看每个查询是否需要返回true,即每个查询需要成功检查顶点之间是否存在边,同时我需要确保每个查询都成功找到一条边,以确保整个查询返回事实上,我有另一种方法可以找到它,这与你的有点相似,我会用它更新我的问题,如果你有意见,哪一个更好,请告诉我。但是我仍然不知道如何修改返回数据,以便能够同时对多个查询结果进行逻辑检查。这也是一个解决办法。还可以使用$a.size.asBoolean将大小转换为布尔值。结果仍然是一系列布尔值。不过,也有一些技巧可以将其压缩为一个布尔值,如标记的答案所示。我同意如果能有更简单的方法来做这件事会很好。最好使用内置函数,因为它感觉非常有用。是的,非常有用,因为它既可以扩展到更多边,也可以显示返回单个布尔值的方法。谢谢是的,非常有用,因为它既可以扩展到更多边,也可以显示返回单个布尔值的方法。谢谢