triblespace 0.18.0

The Triblespace: A lightweight knowledge base for rust.
Documentation
use crate::entity;
use crate::pattern_changes;
use triblespace::prelude::*;

pub mod literature {
    use triblespace::prelude::*;

    attributes! {
        "8F180883F9FD5F787E9E0AF0DF5866B9" as author: valueschemas::GenId;
        "0DBB530B37B966D137C50B943700EDB2" as firstname: valueschemas::ShortString;
        "6BAA463FD4EAF45F6A103DB9433E4545" as lastname: valueschemas::ShortString;
        "A74AA63539354CDA47F387A4C3A8D54C" as title: valueschemas::ShortString;
    }
}

#[test]
fn pattern_changes_finds_new_inserts() {
    let base = TribleSet::new();

    let mut updated = base.clone();
    let shakespeare = ufoid();
    let hamlet = ufoid();
    updated += entity! { &shakespeare @ literature::firstname: "William", literature::lastname: "Shakespeare" };
    updated += entity! { &hamlet @ literature::title: "Hamlet", literature::author: &shakespeare };

    let delta = updated.difference(&base);

    let results: Vec<_> = find!(
        (author: Value<_>, book: Value<_>, title: Value<_>),
        pattern_changes!(&updated, &delta, [
            { ?author @ literature::firstname: "William", literature::lastname: "Shakespeare" },
            { ?book @ literature::author: ?author, literature::title: ?title }
        ])
    )
    .collect();

    assert_eq!(
        results,
        vec![(
            shakespeare.to_value(),
            hamlet.to_value(),
            "Hamlet".to_value(),
        )]
    );
}

#[test]
fn pattern_changes_empty_delta_returns_no_matches() {
    let mut kb = TribleSet::new();
    let shakespeare = ufoid();
    kb += entity! { &shakespeare @ literature::firstname: "William", literature::lastname: "Shakespeare" };

    let delta = TribleSet::new();

    let results: Vec<_> = find!(
        (a: Value<_>),
        pattern_changes!(&kb, &delta, [
            { ?a @ literature::lastname: "Shakespeare" }
        ])
    )
    .collect();

    assert!(results.is_empty());
}