#知识图谱 # #知识 #静态分析 #规范 #内存中 #cairn

cairn-knowledge-graph

一个嵌入式和内存中的知识图谱,用于静态规范分析

9 个不稳定版本 (3 个重大更新)

0.4.2 2022年7月31日
0.4.1 2022年7月25日
0.4.0 2022年6月8日
0.3.0 2022年5月24日
0.1.1 2022年2月28日

#9 in #知识

每月下载量33次

CC-BY-NC-4.0

245KB
5.5K SLoC

test

Cairn 知识图谱

一个嵌入式和内存中的知识图谱,用于静态规范分析。

功能

图类型

Cairn 知识图谱实现了一个有向图。每个顶点都包含一个值。顶点的值可以通过一个唯一的字符串或索引值来选择。

数据类型

顶点可以持有以下类型的值

  • unit,表示没有值
  • string,包含Unicode 标量值
  • 布尔值,
  • 整数,
  • 无符号整数,
  • 浮点数,(IEEE 754-2008),

ACID

Cairn 知识图谱目前不保证ACID 数据库事务属性。

持久性

图存在于内存中,目前不存在于持久存储中。

用法

应用程序可以将 cairn_knowledge_graph 包作为依赖项。构建 cairn_knowledge_graph 需要安装一个兼容 ANSI C11 的 C 编译器和 CMake。

最小示例

use cairn_knowledge_graph::error::GraphComputingError;
use cairn_knowledge_graph::graph::edge::DirectedEdgeDefinedByKeys;
use cairn_knowledge_graph::graph::graph::Graph;
use cairn_knowledge_graph::graph::vertex::{Vertex, VertexValue};
use cairn_knowledge_graph::operations::add_edge::AddEdge;
use cairn_knowledge_graph::operations::add_vertex::AddVertex;
use cairn_knowledge_graph::operations::selection::operators::and::AndOperator;
use cairn_knowledge_graph::operations::select_vertex::SelectVertex;
use cairn_knowledge_graph::operations::selection::vertex_selection::VertexSelection;

macro_rules! add_new_edge {
  ($from_vertex:ident, $edge_type:ident, $to_vertex:ident, $graph:ident) => {
     let edge = DirectedEdgeDefinedByKeys::new(
         $from_vertex.clone().into(),
         $edge_type.clone(),
         $to_vertex.clone().into(),
     );
     $graph.add_edge_and_edge_type_using_keys(edge.clone()).unwrap();
  };
}
 
fn main() {
    let initial_vertex_capacity = 10;
    let initial_edge_type_capacity = 10;
    let mut graph = Graph::new(initial_vertex_capacity, initial_edge_type_capacity).unwrap();

    let zero = Vertex::new(String::from("0"), 0u8.into());
    graph.add_or_replace_vertex(zero.clone()).unwrap();

    let one = Vertex::new(String::from("1"), 1u8.into());
    graph.add_or_replace_vertex(one.clone()).unwrap();

    let one_dot_one = Vertex::new(String::from("1.1"), 1.1f32.into());
    graph.add_or_replace_vertex(one_dot_one.clone()).unwrap();

    let negative_one = Vertex::new(String::from("-1"), (-1i8).into());
    graph.add_or_replace_vertex(negative_one.clone()).unwrap();

    let negative_one_dot_one = Vertex::new(String::from("-1.1"), (-1.1f32).into());
    graph
        .add_or_replace_vertex(negative_one_dot_one.clone())
        .unwrap();

    let integer = Vertex::new(String::from("integer"), String::from("integer").into());
    graph.add_or_replace_vertex(integer.clone()).unwrap();

    let real_number = Vertex::new(
        String::from("real_number"),
        String::from("real_number").into(),
    );
    graph.add_or_replace_vertex(real_number.clone()).unwrap();

    let positive = Vertex::new(String::from("positive"), String::from("positive").into());
    graph.add_or_replace_vertex(positive.clone()).unwrap();

    let negative = Vertex::new(String::from("negative"), String::from("negative").into());
    graph.add_or_replace_vertex(negative.clone()).unwrap();

    let sign = String::from("sign");
    let is_a = String::from("is_a");

    add_new_edge!(negative_one_dot_one, is_a, real_number, graph);
    add_new_edge!(negative_one_dot_one, sign, negative, graph);

    add_new_edge!(negative_one, is_a, real_number, graph);
    add_new_edge!(negative_one, is_a, integer, graph);
    add_new_edge!(negative_one, sign, negative, graph);

    add_new_edge!(zero, is_a, real_number, graph);
    add_new_edge!(zero, is_a, integer, graph);

    add_new_edge!(one, is_a, real_number, graph);
    add_new_edge!(one, is_a, integer, graph);
    add_new_edge!(one, sign, positive, graph);

    add_new_edge!(one_dot_one, is_a, real_number, graph);
    add_new_edge!(one_dot_one, sign, positive, graph);

    let negative_selection = graph
        .select_vertices_connected_to_vertex_by_key(sign, &"negative")
        .unwrap();
    let integer_selection = graph
        .select_vertices_connected_to_vertex_by_key(is_a, &"integer")
        .unwrap();

    let negative_integer_selection = negative_selection.and(&integer_selection).unwrap();
    let negative_integers = negative_integer_selection.vertex_values_ref().unwrap();

    assert_eq!(negative_integers.len(), 1);
    assert_eq!(negative_integers, vec!(&VertexValue::Integer8Bit(-1)));
 }

架构

Cairn 知识图谱受 LAGraph 启发,并使用来自 Timothy A. Davis 的相同底层 GraphBLAS 实现。

许可

cairn_knowledge_graph 在 Creative Commons Attribution Non Commercial 4.0 International 许可下发布。有关其他许可选项,请联系 Sam Dekker。

贡献

欢迎贡献。cairn_knowledge_graph 和您的贡献可能在将来被重新许可并集成到商业软件中。因此,当您提交拉取请求时,将要求您同意贡献者许可协议

依赖项

~2.9–5MB
~97K SLoC