【问题标题】:OrientDB Include property from edge connected to specific vertexOrientDB 包括来自连接到特定顶点的边缘的属性
【发布时间】:2016-10-24 15:14:30
【问题描述】:

我有以下情况:

       (p:p1)
  V1 ---E1---\ 
              \
               V2 (with properties)
              /
  V1 ---E1---/
       (p:p2)

因此,V1 类的两个顶点连接到 V2 类型的另一个顶点,两条边都属于具有属性“p”的同一类 E1。

我想要一个查询:

  • 以 V1 实例为目标(通过 rid)
  • 读取边缘类 E1 连接到所选 V1 的所有 V2 记录(包括所有属性)
  • 还在返回的文档中包含来自连接 E1 边的属性 p。

我试过了:

SELECT *,in('E1')[p] as p FROM (SELECT EXPAND(out('E1')) FROM <V1-rid>) UNWIND p

但这当然会给出 2 个结果,因为投影从 E1 边返回值。我只想在我选择的 V1 和 V2 之间加入 p。

我还有一些与 V2 的其他连接需要包括在内,但我想更精确地指定问题以降低问题的复杂性,我认为(希望)它们不会干扰答案。

更新

澄清:

我希望结果是带有附加属性“p”的完整 V2 记录,因此如果 V2 具有属性 v2p1:、v2p2,则结果记录应如下所示:

{
   "v2p1": <value>,
   "v2p2": <value>,
   "p": <value>
}

最后一个“p”值来自边缘,其他属性来自实际 V2 记录。

【问题讨论】:

标签: orientdb orient-sql


【解决方案1】:

你可以使用这个查询

SELECT FROM (
MATCH {CLASS:v1, AS:v1, WHERE: (@rid=#29:0)}.outE('e1'){AS:e1}.inV('e1'){AS:v2} RETURN v1, e1.p, v2 
) 

我希望这已经足够清楚了。

【讨论】:

  • 另外可以使用SELECT e1_p,v2.* from (直接获取所有属性
  • 感谢您的回答,匹配语法对我来说是新的,非常有用。但是,我希望查询返回扩展的 V2 记录(所有属性),但带有来自 E1 的附加属性“p”。我已经更新了我的问题,以便更清楚地了解结果。
  • @IvanMainetti 使用 v2.* 会破坏属性名称(它们将以“v2_”为前缀),我需要它们成为它们的真实身份,有什么办法吗?我需要实际的 V2 记录,只有一个额外的属性 p(来自连接的边缘)。
  • 你可以使用asSELECT v2.@rid as rid,v2.prop as prop,e1.p as p(注意你需要在比赛中返回e1而不是e1.p
  • @IvanMainetti 我需要 V2 中的所有任意属性,这对我来说是主要问题。从 V2 获取所有属性,同时从边缘 (E1) 获取一个属性。
【解决方案2】:

试试这个:

select *,traversedEdge(-1).p as p from(traverse outE('E1'),inV('E1') from #21:0) where @class='V2'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多