如何使用 java 在 ckan 中创建任何文件的元数据(JSON)?

How to create metadata(JSON) of any file in ckan using java?

我在本地系统中有一个文件,我想创建该文件的元数据,其中包括:

{Filename, create date, update date, file format etc etc} 

作为 JSON 格式的键值对。接下来,我想在 CKAN 中上传它,(CKAN API 调用) 这样我最终可以使用 CKAN url 看到文件。我已经有了带有 CKAN 密钥的 CKAN 主机 url。

有人可以帮我在 Java 中编写这个脚本吗?我是 CKAN 的新手,这是第一次尝试这样做,但我做不到。如果有人可以共享示例代码以供参考,那将会很有帮助。我认为它应该只是一个 API 调用。

1.Below 是相同工作的 python 脚本。但我想在java完成,请帮忙..

metadata ={}
azure_urls=[]
for blob in urls:
    print(blob)
    for url in urls[blob]:
        print(url)
        r = requests.get(url,stream=True)
        file_name = url.split(“/”)[-1]
        with open(file_name, ‘wb’) as data:
            for chunk in r.iter_content(chunk_size = 1024*1024):
                if chunk:
                    data.write(chunk)
        block_blob_service.create_blob_from_path(path.join(container,blob),
                              data.name,
                              file_name ,
                              content_settings=ContentSettings(content_type=mimetypes.guess_type(‘./%s’ %url.split(“/”)[-1])[0]))
        print(‘uploading file to ‘+’‘+blob+' ‘+’in a ‘+ container)
        os.remove(data.name)
        download_url = block_blob_service.make_blob_url(path.join(container, blob),data.name)
        azure_urls.append(download_url)
    metadata[blob]= azure_urls
    metadata[‘Title’] = ‘Dbpedia’+‘-’+blob
    metadata[‘Publisher’] = ‘Name’
    metadata[‘Created’] = datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)
    metadata[‘version’] = “2016-10"
    metadata[ “Container”] = container
    metadata[‘SourceType’] = [url.split(“.”)[-1] for url in azure_urls]
    print(metadata)
  1. 下面是ckanAPI调用语句:

    ckan = ckanapi.RemoteCKAN(‘http://hostname’,‘key’)

3.getting在url中输出如下:

{‘ontology’: [‘link1', ‘link2’], ‘Title’: ‘Dbpedia-ontology’, ‘Publisher’: ‘SiddarthaP’, ‘Created’: ‘2017-08-03 00:55:22’, ‘version’: ‘2016-10’, ‘Container’: ‘dbpedia’, ‘SourceType’: [‘owl’, ‘nt’]}

我假设你正在尝试做的是处理给定格式的一些信息并将其上传到 CKAN。我不确定您在 Python 中提供的代码是否符合您的预期(即 URL 在所有 blob 之间共享,而不是为每个 blob 累积)并且它也不会上传任何内容。

也就是说,使用 JAKAN API v0.4 你可以编写类似的代码:

  • 创建 CKAN 安全客户端
  • 处理您从其他服务收到的信息
  • 创建元数据的 JSON 表示
  • 上传到 CKAN

代码:

private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


public static void processUrls(String[] blobs, Map<String, String[]> urls) {
    CkanClient cc = new CheckedCkanClient("HOSTNAME", "key");

    // Process each blob
    for (String dsName : blobs) {
        System.out.println("DATASET: " + dsName);

        // Process all the available URLS of the same blob
        List<String> urls = new ArrayList<>();
        String publisherName;
        String container;
        for (String url : urls.get(blob)) {
            System.out.println("URL: " + url);
            String[] urlFields = url.split("/");
            String fileName = urlFields[urlFields.length - 1];

            System.out.println(" - Resource " + fileName + " with URL " + url);

            urls.add(url);
        }

        // Construct the JSON metadata
        JSONObject metaData = createMetaData(dsName, urls, publisherName, container);
        System.out.println("METADATA: ");
        System.out.println(metaData.toJSONString());

        // Upload to CKAN
        ObjectMapper objectMapper = new ObjectMapper();
        CkanDataset cd = objectMapper.readValue(metaData, CkanDataset.class);
        CkanDataset createdDataset = cc.createDataset(cd);
    }
}

private JSONObject createMetaData(String dsName, List<String> urls, String publisherName, String container) {
    JSONArray metaDataUrls = new JSONArray();
    JSONArray urlTypes = new JSONArray();
    for (String url : urls) {
        metaDataUrls.put(url);
        String[] urlFields = url.split(".");
        urlTypes.put(urlFields[urlFields.length - 1]);
    }

    JSONObject metaData = new JSONObject();
    metaData.put(dsName, metaDataUrls);
    metaData.put("Title", "Dbpedia-" + dsName);
    metaData.put("Publisher", publisherName);
    metaData.put("Created", FORMAT.format(new Date()));
    metaData.put("version", "2016-10");
    metaData.put("Container", container);
    metaData.put("SourceType", urlTypes);

    return metaData;
}