查询 OrientDB 图

Query on OrientDB graph

我正在构建一个聊天室引擎,我有一个这样的图表:

User---Started--->Room----Discuss--->Item<---Own---User

我想获取特定用户的所有项目和与该项目关联的 roomId。

select 
    *, in('Discuss').in('Started')[name ='julie'] as roomId
    from item

所以这会扔到右边 'Room' 并找到由 'Julie' 开始的那个但它 returns 朱莉的 ID,我如何通过这个查询获得那个房间的 ID ? 就像我需要做一个 'one back' 并得到 @rid...

我是图表的新手,所以任何指针都将不胜感激。

假设您的图有顶点和边 类,并且结构类似于:

您可以结合使用 select 和图表 traverse 查询来 return 您需要的内容。例如:

    select from (traverse both('discuss'), both('started') from #14:0)
    where (@class='room') 
    or (@class='user' and name='Julie')

这将return以下结果(JSON格式)

{
"result": [
    {
        "@type": "d",
        "@rid": "#13:0",
        "@version": 3,
        "@class": "room",
        "name": "Baking",
        "in_started": [
            "#15:0"
        ],
        "out_discuss": [
            "#16:0"
        ],
        "@fieldTypes": "in_started=g,out_discuss=g"
    },
    {
        "@type": "d",
        "@rid": "#12:0",
        "@version": 2,
        "@class": "user",
        "name": "Julie",
        "out_started": [
            "#15:0"
        ],
        "@fieldTypes": "out_started=g"
    }
],
"notification": "Query executed in 0.027 sec. Returned 2 record(s)"

}

更新:

如果你只想return房间的@rid,你可以用另一个select:

包裹上面的查询
select @rid from
    (select from (traverse both('discuss'), both('started') from #14:0)
    where (@class='room') 
    or (@class='user' and name='Julie'))
where @class='room'

此答案基于我对原始问题的评论中的选项 (1),正如您指出的 here "I would like to get all the Items not only the ones that have a room starter by julie"。

SELECT *, $rooms_by_user FROM items LET $rooms_by_user = ( SELECT FROM ( SELECT expand(in('Discuss')) FROM $parent.$current ) WHERE in('Started').Name contains 'Julie' )

所以原始查询获取所有项目,并向输出添加自定义字段(LET 子句和 $rooms_by_user 字段)。

$rooms_by_user 的内部查询正在扩展每个 'Item' 的 'Discuss' 边(每个项目运行),从而返回所有 'Room'与 'Item' 关联的顶点。然后,查询的外部过滤 'Room' 个顶点,仅查找由 'User' 开始且名称为 'Julie'.

的顶点

我不得不在外部查询中使用 contains 作为 in('Started').Name returns 列表,例如 ["Julie"].

通过 rid 过滤用户可能会更好,那么你只需要在 'Started' 边缘的 属性 外过滤(即数据库只需要 'jump' 从顶点到边一次,而不是从顶点到边到顶点 - 这仅在您不使用轻量级边时才适用,这是当前版本中的默认设置。)。