在Bluemix Graph DB中使用set属性创建顶点的正确方法是什么?

时间:2016-03-15 23:52:14

标签: ibm-cloud graph-databases ibm-graph

我正在尝试在Bluemix Graph DB服务中创建一个新顶点。我的数据库的架构如下。

{"name":"Bob","languages":["Node","Python"],"picture":"https://en.gravatar.com/userimage/12148147/46ccae88e5aae747d53e0b1863f72a4e.jpg?size=200","preferred_language":"Node","github_id":"Bob","twitter_id":"Bob"} 我试图用以下POST主体

创建顶点

{"code":"BadRequestError","message":"Property 'languages' with meta properties need to have a 'val'"}

然而,这会导致以下错误

private class SendMessageTask extends AsyncTask<String, Void, String> { Graduate targetGraduate; public SendMessageTask(Graduate targetGraduate){ this.targetGraduate = targetGraduate; } @Override protected String doInBackground(String... params) { URL myUrl = null; HttpURLConnection conn = null; String response = ""; String data = params[0]; try { myUrl = new URL("http://your url"); conn = (HttpURLConnection) myUrl.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); //one long string, first encode is the key to get the data on your web //page, second encode is the value, keep concatenating key and value. //theres another ways which easier then this long string in case you are //posting a lot of info, look it up. String postData = URLEncoder.encode("TOKEN", "UTF-8") + "=" + URLEncoder.encode(targetGraduate.getToken(), "UTF-8") + "&" + URLEncoder.encode("SENDER_ID", "UTF-8") + "=" + URLEncoder.encode(MainActivity.curretUser.getId(), "UTF-8") + "&" + URLEncoder.encode("MESSAGE_DATA", "UTF-8") + "=" + URLEncoder.encode(data, "UTF-8"); OutputStream os = conn.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); bufferedWriter.write(postData); bufferedWriter.flush(); bufferedWriter.close(); InputStream inputStream = conn.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); String line = ""; while ((line = bufferedReader.readLine()) != null) { response += line; } bufferedReader.close(); inputStream.close(); conn.disconnect(); os.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return response; } @Override protected void onPostExecute(String s) { //do what ever you want with the response Log.d("roee", s); } }

languages属性的基数为SET,为SET dataType创建属性的正确方法是什么?我原以为它是一个JSON数组。

2 个答案:

答案 0 :(得分:2)

Ryan,SET不是数据类型。您还可以将语言设为带有分隔值的字符串。

Beta版本支持的唯一类型是:String,Integer,Boolean,Float

答案 1 :(得分:2)

问题在于您尝试创建数据类型为List<String>的单个顶点属性,IBM Graph不支持该属性(仅支持JSON基元类型)。要利用SET数据类型的属性,您需要创建多个顶点属性。

事实证明,TinkerPop中的基数和数据类型之间的区别可能有点令人困惑。这是一个应该澄清事情的例子:

$ curl https://ibmgraph/11/g/schema -XPOST -Hcontent-type:application/json -d '{"propertyKeys":[{"name":"languages","dataType":"String","cardinality":"SET"}]}' | jq .
{
  "requestId": "9e0ea947-f9a1-407b-ab1a-cd9b7fd5d561",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {}
  },
  "result": {
    "data": [
      {
        "propertyKeys": [
          {
            "name": "languages",
            "dataType": "String",
            "cardinality": "SET"
          }
        ],
        "vertexLabels": [],
        "edgeLabels": [],
        "vertexIndexes": [],
        "edgeIndexes": []
      }
    ],
    "meta": {}
  }
}
$ curl https://ibmgraph/11/g/vertices -XPOST | jq .
{
  "requestId": "2ce85907-2aca-4630-876f-31775e74e1de",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {}
  },
  "result": {
    "data": [
      {
        "id": 4112,
        "label": "vertex",
        "type": "vertex",
        "properties": {}
      }
    ],
    "meta": {}
  }
}
$ curl https://ibmgraph/11/g/vertices/4112 -XPOST -Hcontent-type:application/json -d '{"languages":"Node"}' | jq .
{
  "requestId": "52ad6d49-46c9-41aa-9928-5a567099d773",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {}
  },
  "result": {
    "data": [
      {
        "id": 4112,
        "label": "vertex",
        "type": "vertex",
        "properties": {
          "languages": [
            {
              "id": "si-368-sl",
              "value": "Node"
            }
          ]
        }
      }
    ],
    "meta": {}
  }
}
$ curl https://ibmgraph/11/g/vertices/4112 -XPOST -Hcontent-type:application/json -d '{"languages":"Python"}' | jq .
{
  "requestId": "19886949-6328-4e19-8cac-8fdab37ef2a5",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {}
  },
  "result": {
    "data": [
      {
        "id": 4112,
        "label": "vertex",
        "type": "vertex",
        "properties": {
          "languages": [
            {
              "id": "si-368-sl",
              "value": "Node"
            },
            {
              "id": "16q-368-sl",
              "value": "Python"
            }
          ]
        }
      }
    ],
    "meta": {}
  }
}