查询 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' 从顶点到边一次,而不是从顶点到边到顶点 - 这仅在您不使用轻量级边时才适用,这是当前版本中的默认设置。)。
我正在构建一个聊天室引擎,我有一个这样的图表:
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' 从顶点到边一次,而不是从顶点到边到顶点 - 这仅在您不使用轻量级边时才适用,这是当前版本中的默认设置。)。