问题标签 [orient-sql]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
153 浏览

lazy-evaluation - 在 Orient-DB 中懒惰地执行查询

在当前项目中,我们需要在几乎完全连接的图中找到最便宜的路径,每个顶点对可以包含很多边。

我们开发了一个包含函数的插件

  1. 对于特殊遍历,此图可在执行时降低相似路径的重复出现率TRAVERSE。我们将其称为search()
  2. 用于从此类遍历的结果中特别有效地提取所需信息。我们将其称为extract()
  3. N用于根据目标参数提取最佳记录而无需昂贵的成本ORDER BY。我们将其称为best()

但是结果查询在完整数据上的性能仍然不理想。

所以我们决定修改search()函数,以便它可以首先观察最佳边缘,并通过使用函数的当前状态来修剪导致绝对不希望的结果的路径best()
整体解决方案实际上是Branch and Bound 方法的灵活实现

结果查询(省略extract()步骤)应如下所示

WHILE这种形式是非常需要的,因此我们可以根据当前任务调整条件WHERE。该path字段是通过search()包含所有信息best()以继续生成的。

问题是best()函数严格在search()函数之后执行,因此search()不能根据已经评估的结果修剪非最佳分支best()

所以问题是:
有没有一种方法可以TRAVERSE一步一步地处理结果SELECT,就像旧路径在TRAVERSE使用 withsearch()处理的早期路径之后SELECT一样best()

0 投票
1 回答
229 浏览

orientdb - Orient SQL - 使用 WHERE 过滤结果集?

我有一些关于东方 SQL 查询的语义问题。

以这个非常简单的图表为例:

换句话说,去掉#12:1 的给定用户是去掉#12:2 的另一个用户的朋友。

为了得到用户 #12:1 的朋友,可以用 Orient SQL 像这样表达这一点:

此查询将返回一个结果列表,该列表由具有 rid #12:2 的用户组成。

现在假设我想通过附加条件过滤该结果列表,例如数值(“年龄”):

上面的查询将过滤当前顶点 (#12:1),而不是结果集。这是有道理的,但是有没有办法将过滤器应用于 EXPAND(both("FriendOf")) 结果而不是当前顶点?我知道我可以像这样用 gremlin 做到这一点:

但是上面似乎没有使用索引(至少在我要求它解释时没有)。对于非常大的数据集,这是有问题的。

那么有没有合适的方法将 WHERE 语句应用于结果数据集?

谢谢 !

0 投票
2 回答
475 浏览

orientdb - OrientDB 包括来自连接到特定顶点的边缘的属性

我有以下情况:

因此,V1 类的两个顶点连接到 V2 类型的另一个顶点,两条边都属于具有属性“p”的同一类 E1。

我想要一个查询:

  • 以 V1 实例为目标(通过 rid)
  • 读取边缘类 E1 连接到所选 V1 的所有 V2 记录(包括所有属性)
  • 还包括返回文档中连接 E1 边的属性 p。

我尝试过:

但这当然会给出 2 个结果,因为投影从 E1 边缘返回值。我只想将 p 包含在我选择的 V1 和 V2 之间的边缘。

我还有一些与 V2 的其他连接需要包括在内,但我想更精确地指定问题以降低问题的复杂性,我认为(希望)它们不会干扰答案。

更新

澄清:

我希望结果是带有附加属性“p”的完整 V2 记录,因此如果 V2 具有属性 v2p1:、v2p2,则生成的记录应如下所示:

最后一个“p”值来自边缘,其他属性来自实际的 V2 记录。

0 投票
1 回答
101 浏览

orientdb - OrientDB SQL:包括来自连接顶点的消除

我有一个顶点“A”连接到顶点“B”和“C”。

我想用 B 和 C 的记录 ID 的附加列表查询 A。

属性外观示例:

我想要一个查询 A 给我:

我宁愿只用预测就能做到这一点。它适用于 B 和 C 中的任何自定义字段,但对于 @rid 我得到一个链接(为什么会出现这种不一致?)。

我试过了:

这正是我想要的,但列表中的摆脱是指向记录的链接,而不仅仅是摆脱。

这使:

连接的属性只是一个字符串。

@rid 和其他属性的这种不一致可能(希望如此?)有一个原因。正如我所写的,如果@rid 是“id”,那么第一个示例可以正常工作。无论如何,我想知道一个简单的方法来做到这一点,因为我觉得它应该很容易做到。

更新

在上面的示例中添加 id 作为属性示例是一种误导,因为它可能以某种方式暗示它是唯一的(尽管我从未说过),所以我将其删除。我添加它们只是为了将 3 条记录分开。但是,record-id 是用作分隔上述顶点的唯一 id,因此无法使用记录的任何属性。为了进一步澄清,记录可以具有任意属性。不仅是上面给出的示例。

同样,第一个问题是是否可以使用投影?

进一步的评论:我觉得很奇怪,如果我为每条记录创建一个与@rid 完全相同的记录 ID 的属性“rid”,我可以轻松地做到这一点。为什么我必须这样做(我不会这样做)以使其易于使用。

更新2

我还希望能够一次定位多个顶点并为每个顶点附加连接。对于许多属性(但不是@rid),我已经使用投影进行了此操作。

0 投票
1 回答
73 浏览

orientdb - 在orientDB中找到两个给定顶点之间的边的最快方法是什么

我目前有 2 个名为community和的顶点集合user。作为社区成员的每个用户都使用边缘链接到该社区community_user

我正在尝试community_user为给定用户更新其 _id 和给定其 _id 的边缘community

这个查询确实有效,尽管一旦community_user边缘被填充它会相当慢。

有没有办法索引这个搜索或更快的解决方案来找到我需要的值?

我当前的相关索引在community._id并且user._id

EXPLAIN查询的结果是: