OrientDB 查询 return 满足表格形式约束的匹配路径
OrientDB query to return matched paths satisfying constraints in tabular form
我是 OrientDB 的新手,我正在尝试组合一个查询,以在一个相当简单的结构中查找与模板匹配的路径。
结构如下所示:
节点数
边描述
- "A" 个节点将只有一个 "E1" 边连接到一个 "B" 个节点。
- "C" 节点总是有两条 "E2" 边连接到两个不同的 "B" 节点。
示例数据
我加载了一个小数据集,如下所示:
查询
我正在尝试组合查询以查找包含超过权重阈值的 "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
使用您的数据,我获得了以下结果:
希望对您有所帮助!伊万
我是 OrientDB 的新手,我正在尝试组合一个查询,以在一个相当简单的结构中查找与模板匹配的路径。
结构如下所示:
节点数
边描述
- "A" 个节点将只有一个 "E1" 边连接到一个 "B" 个节点。
- "C" 节点总是有两条 "E2" 边连接到两个不同的 "B" 节点。
示例数据
我加载了一个小数据集,如下所示:
查询
我正在尝试组合查询以查找包含超过权重阈值的 "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
使用您的数据,我获得了以下结果:
希望对您有所帮助!伊万