OrientDB 查询 return 满足表格形式约束的匹配路径

OrientDB query to return matched paths satisfying constraints in tabular form

我是 OrientDB 的新手,我正在尝试组合一个查询,以在一个相当简单的结构中查找与模板匹配的路径。

结构如下所示:

节点数

边描述

示例数据

我加载了一个小数据集,如下所示:

查询

我正在尝试组合查询以查找包含超过权重阈值的 "C" 节点的路径,包括两个连接的 "B" 节点和 "A"另一端的节点与 "C" 节点具有相同的日期。

因此,我正在寻找与此模式匹配的路径:

[A1] -(E1)-> [B1] <-(E2)- [C1] -(E2)-> [B2] <-(E1)- [A2]

理想情况下,我希望将结果转化为表格形式,每行捕获每条路径:

C.Date | C.Weight | B1.ID | B2.ID | A1.Flag | A2.Flag

我一直在 OrientDB 网站上查看 MATCH and TRAVERSE 的文档,但那里的示例大多是 "friend of a friend" 类型的搜索,我很难将其映射到我的问题,所以远.

我最初尝试使用嵌套 SELECT 和 TRAVERSE 查询,但我 运行 很难让 "A" 节点中的日期字段与 "C" 中的内容相匹配节点两跳远...

所以我切换到 MATCH 查询,我认为这让我很接近。我使用以下查询在 OrientDB 浏览器应用程序中的 图表视图 中得到一个看起来正确的图表:

MATCH {class: C, as: C, where: (Weight>0.8 AND Date.format('yyyy-MM')='2014-09')}.out('E2') 
    {as: B}.in('E1') 
    {as: A, where: ($matched.C.Date = $currentMatch.Date) } 
RETURN $elements

但这并没有真正让我得到我正在寻找的表格结果。通过将 RETURN 更改为以下内容,我可以获得 C-B1-A1 和 C-B2-A2 路径的两行:

RETURN C.Date as Date, C.Weight as Weight, B.ID, A.Flag

哪个returns:

 Date               | Weight | B_ID | A_Flag
--------------------+--------+------+--------
2014-09-10 00:00:00 | 0.95   | 1    | A 
2014-09-10 00:00:00 | 0.95   | 2    | A 

但这不是我要找的。我想认为我当前的查询接近我想要的结果,但我不确定。是否需要重构整个查询?

我愿意在必要时对模式进行一些修改,但我更愿意避免在顶点中放置与边告诉我相同信息的字段(即添加 C.B_ID1 和 C.B_ID2 字段)如果可能的话。

非常感谢所有帮助!

试试这个

select Date, Weight, list(B_ID)[0] as B1_ID, list(B_ID)[1] as B2_ID, list(A_flag)[0] as A1_flag, list(A_flag)[1] as A2_flag
from
(
MATCH {class: C, as: C, where: (weight>10 AND date.format('yyyy-MM')='2014-09')}.out('E2')
    {as: B}.in('E1') {as: A, where: ($matched.C.date=$currentMatch.date)}

RETURN C, C.date as Date, C.weight as Weight, B.ID, A.flag
)
group by C

使用您的数据,我获得了以下结果:

希望对您有所帮助!伊万