【问题标题】:Dgraph in Java. How to run raw string mutation query?Java中的Dgraph。如何运行原始字符串突变查询?
【发布时间】:2019-06-16 04:45:36
【问题描述】:

我需要能够在不使用 newBuilder() 的情况下运行原始字符串突变查询:

Gson gson = new Gson();
String json = gson.toJson(newEmployer);
Transaction newTransaction = this.dgraphClient.newTransaction();
Mutation mu = Mutation.newBuilder().setSetJson(ByteString.copyFromUtf8(json.toString())).build();
newTransaction.mutate(mu);

我想跑步:

String email = "ba@a.aa";
String userType = "JOB_SEEKER";
Transaction newTransaction = this.dgraphClient.newTransaction();
String query = 
        "{\n" +
        "    set { \n" +
        "       _:user <label> \"USER\" . \n" +
        "      _:user <userType> \"" + email + "\" . \n" +
        "      _:user <email> \"" + userType + "\" . \n" +
        "    }\n" +
        "}";
Mutation mu = Mutation.parseFrom(ByteString.copyFromUtf8(query));
newTransaction.mutate(mu);

但我在运行时收到错误消息:“在解析协议消息时,输入意外在字段中间结束。这可能意味着输入已被截断或嵌入的消息误报了自己的长度。”

【问题讨论】:

    标签: java dgraph


    【解决方案1】:

    在 gRPC 客户端(例如 dgraph4j)中为突变设置 N-Quad Triples 时,您只需自己指定换行符分隔的三元组并将它们传递给Mutation#setSetNquads。他们没有被set包围。换句话说,而不是这样:

    {
      set {
        _:user <label> "USER" .
        _:user <userType> "USER_TYPE" .
        _:user <email> "ba@a.aa" .
      }
    }
    

    你只需要三元组:

    _:user <label> "USER" .
    _:user <userType> "USER_TYPE" .
    _:user <email> "ba@a.aa" .
    

    下面是它在 Java 代码中的样子:

    String email = "ba@a.aa";
    String userType = "JOB_SEEKER";
    Transaction newTransaction = this.dgraphClient.newTransaction();
    String triples = 
            "_:user <label> \"USER\" .\n" +
            "_:user <userType> \"" + email + "\" .\n" +
            "_:user <email> \"" + userType + "\" .";
    Mutation mu =
        Mutation.newBuilder()
            .setSetNquads(ByteString.copyFromUtf8(triples))
            .build();
    Assigned assigned = newTransaction.mutate(mu);
    

    { set { ... } } 的第一个突变格式用于 HTTP 客户端,其中包括 Dgraph Ratel 或 curl 中的突变。

    有关 Dgraph 突变的更多信息,请参阅突变文档:https://docs.dgraph.io/mutations/

    【讨论】:

    • 实际驱动中DgraphProto.MutationJ类型的setSetNquads(ByteString)方法未定义
    • @AlexKumundzhiev 感谢您的澄清。我更新了使用 Mutation.newBuilder() 的答案。
    • 你是救生员。一直在尝试修复这个错误,终于去掉了{set{}}。成功了!
    【解决方案2】:

    我找到了一些解决方案,它不是字符串,但它有效。

    JSONObject query = new JSONObject();
    query.put("label", "USER");
    query.put("userType", userType);
    query.put("email", email);
    Mutation mu = Mutation.newBuilder().setSetJson(ByteString.copyFromUtf8(query.toJSONString())).build();
    

    【讨论】:

    • 我从 Node.js 驱动程序示例中想象它。我来自 JavaScript 世界,这对我来说比 Dgraph 文档更明确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2018-09-22
    • 2019-02-25
    • 2013-12-01
    相关资源
    最近更新 更多