#back-end #neo4j #metadata #storage #format #json #simulation

simuldb

支持后端和格式无关的数据存储,用于存储模拟结果及其元数据

29个版本 (11个重大更新)

0.12.3 2023年12月7日
0.11.3 2023年12月1日
0.11.0 2023年11月30日

#1340数据库接口

Download history 395/week @ 2024-03-14 9/week @ 2024-03-28 3/week @ 2024-04-04 2/week @ 2024-05-23 4/week @ 2024-05-30

每月下载 365次
simuldb-utils 中使用

MIT/Apache

95KB
2.5K SLoC

此库提供对模拟结果及其关于所使用[软件]和模拟[运行]的元数据的数据存储,且后端和格式无关

主要用例如下

  1. 在集群上生成数据,并使用JSON后端保存
  2. 将数据传输到Neo4j后端
  3. 直接使用Neo4j选择数据

因此,主要目标是提供简单易用的数据写入解决方案,没有计划支持高级搜索或查询功能。

数据存储不由数据库处理,只关联元数据。

目前包含两个后端

  • Json,将所有数据保存到JSON文件中
  • Neo4j,使用Neo4j数据库作为后端(仅写入)

可以通过实现DatabaseDatabaseSession特质来实施自定义后端。会话旨在将[数据集]的特定[运行]与[软件]关联起来。[数据集]是存储在任何任意格式文件中的数据的引用。

特性

  • json 启用 Json 后端
  • neo4j 启用 Neo4j 后端
  • sha 启用 [sha2] 支持自动哈希计算
  • arbitrary 启用对 [arbitrary] 的支持(用于测试,默认启用)

示例

这创建了一个基于 Json 的数据库,并写入了一些任意数据。注意,为了创建会话,通常需要使用 [vergen_session] 宏。

use std::io::Write;
use serde::Serialize;
use simuldb::prelude::*;

// Define a metadata type
#[derive(Debug, Serialize)]
struct Metadata {
    a: usize,
    b: String,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    # std::env::set_current_dir(format!("{}/..", env!("CARGO_MANIFEST_DIR")))?; // change to top level directory
    // Create or open database
    let mut json = Json::new("output/json");

    // Start new session which will contain references to the datasets
    let software = Software::new("example", "1.0", "now");
    let run = Run::new("now");
    let session = Session::new(software, run);
    let mut json_session = json.add_session(session)?;

    // Create a directory for the result data
    std::fs::create_dir_all("output/data")?;

    // Generate some data and add it to the database
    for a in 0_usize..10 {
        // A DataWriter can be used to automatically calculate
        // the hash of a file and create a Dataset from it
        let mut writer = DatasetWriter::new("output/data")?;

        // Write some data to the output file
        writeln!(writer, "a^2 = {}", a.pow(2))?;

        // Generate metadata to associate with it
        let metadata = Metadata {
            a,
            b: "squaring".to_string(),
        };

        // Add the corresponding dataset to the database
        let dataset = writer.finalize(metadata)?;
        json_session.add_dataset(&dataset)?;
    }

    Ok(())
}

依赖项

~2–16MB
~203K SLoC