0

我需要能够在不使用 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);

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

4

2 回答 2

2

在 dgraph4j 等 gRPC 客户端中为突变设置 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 或 with 中的突变curl

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

于 2019-06-12T00:57:53.073 回答
0

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

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();
于 2019-06-14T01:10:28.337 回答