#rdf #nodejs #parser #node #data #add-on #js

rdf-tortank

Node 插件用于解析和操作 n3/turtle 数据。

5 个版本

0.2.1 2023年9月4日
0.2.0 2023年8月29日
0.1.5 2023年8月27日
0.1.4 2023年8月27日
0.1.3 2023年8月27日

#9#插件

每月 25 次下载

MIT 许可证

31KB
585

TortankJS

Node 插件,用于解析和操作 n3/turtle 数据。使用 Tortank

安装

使用预构建的 Node 插件 (GLIBC)

此方法仅适用于您在 Linux 上且已安装 GLIBC 2.31+(使用 ldd --version 进行检查)。

使用 docker 的示例

  • docker run--rm-it node:16-bookworm bash
  • mkdir example&&cd example
  • npm init--yes
  • npm i rdf-tortank-linux
  • node
  • consttortank= require('rdf-tortank-linux')

使用预构建的 Node 插件 (MUSL)

此方法仅适用于您在 Linux 上且已安装 libc.musl-x86_64(使用 ldd --version 进行检查)。

使用 docker 的示例

  • docker run--rm-it node:16-bookworm bash
  • mkdir example&&cd example
  • npm init--yes
  • npm i rdf-tortank-linux-musl
  • node
  • consttortank= require('rdf-tortank-linux-musl')

使用 Rust

这是针对不同平台的首选解决方案。

  1. 安装 Rust
  2. 安装 Node
  3. 在您的项目中 npm i --save-dev cargo-cp-artifact rdf-tortank
  4. node
  5. consttortank= require('rdf-tortank')

使用 docker 的示例

  • docker run--rm-it rust bash
  • apt update&&apt upgrade-y
  • curl -fsSLhttps://deb.nodesource.com/setup_16.x | bash - && apt-getinstall -ynodejs
  • mkdir example&&cd example
  • npm init--yes
  • npm i--save-dev cargo-cp-artifact rdf-tortank
  • node
  • consttortank= require('rdf-tortank')

文档

语句

基于主题、谓词和对象过滤模型。它使用与以下示例相同的参数,除了没有 rhsPath / rhsData。

const data = `
      @prefix foaf: <http://foaf.com/>.
        [ foaf:name "Alice" ] foaf:knows [
          foaf:name "Bob" ;
          foaf:lastName "George", "Joshua" ;
          foaf:knows [
          foaf:name "Eve" ] ;
    foaf:mbox <[email protected]>] .
`;

let params = {
    lhsData: data, // string|undefined, if not provided use lhsPath
    outputType: "n3", // js|n3|undefined,  output type
    extraPrefixes: { // also optionals, if you need more prefixes to be defined
      ext: "http://example.org/show/",
    },
    wellKnownPrefix: undefined, // undefined | string, for anon nodes (https://www.w3.org/2011/rdf-wg/wiki/Skolemisation)
    subject: undefined, // uri|undefined, to filter subjects (must be an absolute uri)
    predicate: "<http://foaf.com/name>", // rdf iri|undefined, to filter predicates (muts be an absolute uri)
    object: '"Eve"', // rdf string | rdf iri | undefined, to filter objects

};

tortank.statements(params);

您还可以使用前缀,假设模型中已知这些前缀。在上面的示例中,您还可以这样做

let paramsWithPrefix = {
    lhsData: data, 
    outputType: "js", 
    subject: undefined, 
    predicate: "foaf:lastName", // use prefix foaf
    object: undefined // rdf string | rdf iri | undefined, to filter objects
};
tortank.statements(params);


差异

创建一个新的、独立的模型,包含左侧模型中不在右侧模型中的所有语句。


// diff between model a and model b, store result in a  file
const paramsByPath = {
    lhsPath: "./example/modelA.ttl", // string|undefined, to load the left model by file, if not provided, use lhsData
    rhsPath: "./example/modelB.ttl", // string|undefined, to load the right model by file, if not provided, use rhsData
    outputType: "n3", // either n3|json|undefined
    outputFilePath: "/tmp/diff.ttl", // string|undefined, if you want to save output directly into a file
    bufSize: 10 // number|undefined, optional, if outputFilePath is set, buffering 
}

try {
    tortank.difference(paramsByPath); // check content in /tmp/diff.ttl
}catch(e) {
    console.log("error! ", e);
}


// diff between model a and model b, store result in memory as javascipt object

const lhsData = `
      @prefix foaf: <http://foaf.com/>.
        [ foaf:name "Alice" ] foaf:knows [
          foaf:name "Bob" ;
          foaf:lastName "George", "Joshua" ;
          foaf:knows [
          foaf:name "Eve" ] ;
    foaf:mbox <[email protected]>] .
`;
const paramsByDataAndPath = {
    lhsData, // string|undefined, to load the left model by file, if not provided, use lhsData
    rhsPath: "./example/modelC.ttl", // string|undefined, to load the right model by file, if not provided, use rhsData
}

try {
    let data = tortank.difference(paramsByDataAndPath); 
    console.log(data);
}catch(e) {
    console.log("error! ", e);
}


交集

创建一个新的、独立的模型,包含左侧模型和右侧模型中都有的所有语句。

参数与差异相同(请参见上面的示例)。

try {
    tortank.intersection(paramsByDataAndPath); 
}catch(e) {
    console.log("error! ", e);
}

合并

合并两个模型。参数与差异和交集相同(请参见上面的示例)。

try {
    tortank.merge(paramsByDataAndPath); 
}catch(e) {
    console.log("error! ", e);
}

内存中 js 模型的映射函数

可以提供一个映射函数来将模型中的每个三元组转换为其他内容。如果函数返回 null 或 undefined,则三元组将被过滤。

它只适用于 outputType js 和内存模型。


const fun = (triple) => {
    if (triple.object.value.includes("Eve")) {
        triple.object.value = "Robert";
    }
    return triple;
};

const data = `
      @prefix foaf: <http://foaf.com/>.
        [ foaf:name "Alice" ] foaf:knows [
          foaf:name "Bob" ;
          foaf:lastName "George", "Joshua" ;
          foaf:knows [
          foaf:name "Eve" ] ;
    foaf:mbox <[email protected]>] .
`;

let params = {
    lhsData: data, 
    outputType: "js",
    extraPrefixes: { // also optionals, if you need more prefixes to be defined
      ext: "http://example.org/show/",
    },
    wellKnownPrefix: undefined, 
    subject: undefined,
    predicate: "<http://foaf.com/name>", 
    object: '"Eve"', 
    mapperFunction: fun
};

tortank.statements(params); // for example, but could be merge, difference,..

依赖项

~3.5–4.5MB
~89K SLoC