查询OrientDB图

时间:2015-05-22 23:10:03

标签: orientdb

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

operator <<

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

Dim ws As Worksheet
Dim cell as Range
For Each ws In ActiveWorkbook.Worksheets
    For Each cell in ws.UsedRange.Cells
        ` More stuff here
    Next
Next

所以这会抛出正确的'房间'并找到一个由'Julie'开始但它返回Julie的Id,我如何得到这个查询该房间的Id? 这就像我需要做一个'一个回来'并获得@rid ...

我是图表的新手所以任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

这个答案基于我对原始问题的评论中的选项(1),因为您指出here“我想让所有项目不仅仅是那些有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'边缘(每个项目运行),从而返回与'Item'关联的所有'Room'顶点。然后,查询的外部部分仅过滤“房间”顶点,仅查找由名为“Julie”的“用户”启动的顶点。

我必须在外部查询中使用contains,in('Started').Name会返回一个列表,例如["Julie"]

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

答案 1 :(得分:1)

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

enter image description here

您可以结合使用select和图traverse查询来返回所需内容。例如:

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

这将返回以下结果(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)"

}

<强>更新

如果您只想返回房间的@rid,可以使用另一个选择包装上述查询:

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'