【问题标题】:Can we UPSERT an EDGE in orientdb?我们可以在 orientdb 中 UPSERT 边缘吗?
【发布时间】:2016-06-27 17:59:46
【问题描述】:

是否有可能在 orientdb.如果它不存在,是否有办法检查边缘是否存在,如果存在,则只需更新边缘,否则创建新边缘。我正在使用 Orientdb 2.1.13 版本。 谢谢

【问题讨论】:

  • 您好,您使用的是哪种语言(OSQLJavaJavascript、...)?跨度>
  • 我正在使用 .net C#

标签: orientdb upsert orientdb-2.1


【解决方案1】:

通过 SQL,您可以使用基本的 UPDATE 命令

update written_by SET out = #9:2, in = #16:43, prop="gianni" UPSERT WHERE out = #9:2 and in = #16:43

http://orientdb.com/docs/last/SQL-Update.html

【讨论】:

  • 基本上它会创建同一记录的不同版本。如何阻止它被创建?
  • 我不明白你为什么说@imainetti 的查询创建了另一个记录。我试过了,它不会创建任何重复记录。
  • 我删除了我之前的评论。它为并发目的创建相同记录的不同版本。
  • 这非常有用,因为手册在这里没有说太多。但是我尝试过(v3.0.0)并执行相同的语法给了我以下异常:java.lang.ClassCastException:java.util.ArrayList 无法转换为 com.orienttechnologies.orient.core.db.record.OIdentifiable 这是我的批次:开始; LET $from = 从内容中选择 uri='www.webgraph.com'; LET $to = 从内容中选择 uri='webgraph1.com'; UPDATE Navigation SET out = $from, in = $to, timestamp = sysdate() UPSERT WHERE out = $from and in = $to;犯罪;返回 $edge;有什么想法吗?
【解决方案2】:

当您使用“updatewritten_by SET out = #9:2, in = #16:43, prop="gianni" UPSERT WHERE out = #9:2 and in = #16:43”时,它不会对边正常工作:如果边不存在,它将创建边,但不会在顶点中创建 in 和 out 属性,因此,例如,您将无法查询 MATCH。它以这种方式工作,因为“UPDATE/UPSERT 在文档级别工作,因此它不会从顶点创建连接。正如作者所说,使用它,您将得到一个损坏的图表。

但您可以从版本 3.0.1 开始对边缘使用“upsert”,它会正常工作 - 但您需要执行以下操作:

在 edge_class (out, in) 上创建唯一索引 - 很奇怪 - 顺序很重要! 为此,您需要先创建 in 和 out 属性,否则 db 无法创建索引,并且当您尝试运行“创建索引”命令时会出现异常。 然后,使用命令 CREATE EDGE UPSERT FROM TO 。

在这种情况下,只有当它不存在时才会创建边缘,并且它会为顶点类创建输入和输出属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多