1 个不稳定版本
0.1.0 | 2020 年 5 月 2 日 |
---|
#16 在 #important
295KB
1K SLoC
本体
不再管理命名空间对象映射,废弃已知的本体的拼写错误。就像 DefinitelyTyped,但针对本体。
用法
@ontologies/core
当处理 RDF(链接数据)本体时,本体非常重要,但能够快速创建和操作 RDF 的基本构建块同样重要。 @ontologies/core
导出一个对象(数据工厂),其目的是做到这一点。
假设以下示例中的导入
import rdf from "@ontologies/core"
创建字面量
// Strings
rdf.literal("Hello world!")
// { termType: "Literal", value: "Hello World!", datatype: { termType: "NamedNode", value: "http://www.w3.org/2001/XMLSchema#string" } }
// Numbers
rdf.literal(9001)
// { termType: "Literal", value: "9001", datatype: { termType: "NamedNode", value: "http://www.w3.org/2001/XMLSchema#integer" } }
大多数 JS 字面量将被映射到其 RDF(xsd)对应物,也可以显式传递数据类型。请注意,RDF 中的数据类型必须是 IRI。
rdf.literal("(5,2)", rdf.namedNode("http://example.com/types/myCoordinate"))
// { termType: "Literal", value: "(5,2)", datatype: { termType: "NamedNode", value: "http://example.com/types/myCoordinate" } }
创建链接
使用 namedNode
创建指向其他资源的链接,这些资源已经被 命名,这意味着一个权威机构已经在其域中为该资源分配了一个固定的标识符。这可以是一个网络资源(例如 http:
、https:
)但也可以是互联网(例如 ftp:
或 magnet:
)或其他地方(例如 urn:isbn:
或 doi:
)。请注意,选择广泛部署的方案(例如 https:
)将使其他人更容易查找、访问和共享您的数据。
rdf.namedNode("https://schema.org/Thing")
// { termType: "NamedNode", value: "https://schema.org/Thing" }
rdf.namedNode("https://example.com/myDocument#paragraph")
// { termType: "NamedNode", value: "https://example.com/myDocument#paragraph" }
rdf.namedNode("urn:isbn:978-0-201-61622-4")
// { termType: "NamedNode", value: "urn:isbn:978-0-201-61622-4" }
酷 iris 不变,但设计系统是困难的,因此将会有没有自己的名称或分配名称过于昂贵的资源。这就是空白节点可以发挥作用的地方,这些也是资源,但具有 "尚未分配的标识符"。这是一种有点棘手的方式来说“这个事物有名字,但我还不知道它”。
// Create blank nodes (links which have no place in the web yet)
rdf.blankNode()
// { termType: "BlankNode", value: "b0" }
rdf.blankNode("fixed")
// { termType: "BlankNode", value: "fixed" }
请注意,大多数时候,可以轻松地将空白节点替换为片段(#
)IRI 而不会遇到太多麻烦。
{
"@id": "http://example.com/myCollection",
"members": {
"@id": "http://example.com/myCollection#members", // Append `#members` to the base rather than use a blank node
"@type": "http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#_0": "First item",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#_1": "Second item",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#_2": "Third item",
}
}
创建语句
// Create quads (Statements about some thing in the world)
rdf.quad(s, p, o)
// { subject: <s>, predicate: <p>, object: <o>, graph: <defaultGraph> }
// Compare rdf objects
import { Thing } from "@ontologies/schema";
console.log(rdf.equals(rdf.namedNode("https://schema.org/Thing"), Thing))
// true
// Serialize to n-triples/quads
console.log(rdf.toNQ())
其他导出
@ontologies/core 的导出概述;
- 一个默认导出,它是当前分配的全局 数据工厂 的代理。
- 一个名为
globalSymbol
的命名导出,它是一个用于识别其他 @ontologies/ 包所使用的数据工厂的符号。 - 一个名为
setup
的命名导出,它将 PlainFactory 绑定到全局作用域下的 globalSymbol 标识符,如果之前未定义。 - 一个名为
globalFactory
的命名导出,它应该是对最后一个 . 的引用。 - 一个名为导出
PlainFactory
的实现,该实现以功能方式(例如,没有实例方法,但在工厂本身提供equals
函数)对数据工厂接口(进行了一些调整)。 - 一个名为导出
createNS
,您可以使用它轻松创建命名空间,并使用全局工厂创建命名节点。 - 一组用于处理RDF的有用类型。
@ontologies/*
其他包由各自的本体生成,为客户端应用程序提供可导入的符号,以及一个名为导出 ns
的导出,可以在给定的命名空间内创建自定义附加项。
import { name } from '@ontologies/schema'
console.log(name) // http://schema.org/name
使用默认导出
import schema from '@ontologies/schema'
console.log(schema.name) // http://schema.org/name
自定义项
import { ns } from '@ontologies/schema'
console.log(ns('extension')) // http://schema.org/extension
使用 .value
获取字符串表示形式
import { name } from '@ontologies/schema'
console.log(name.value) // "http://schema.org/name"
重写默认工厂
使用的默认工厂是该包中的 PlainFactory
。这是一个应该满足大多数需求的工厂,但某些JS RDF库期望工厂上可用更多的方法。可以通过自定义工厂来重写工厂。
通过从 @ontologies/core
调用 setup()
来初始化自定义工厂。
import { setup } from "@ontologies/core";
import myFactory from "./myFactory";
setup(new myFactory);
希望提供与 PlainFactory 不同的默认值但不想覆盖最终用户设置的库作者可以软重写工厂;
import { setup } from "@ontologies/core";
import LibFactory from "./LibFactory";
setup(new LibFactory(), false); // Passing false will override the default but not a user-set factory.
我的工厂没加载!
很可能是您在模块初始化周期中调用 setup
太晚。请确保;
- 将设置调用移到 单独的 文件中。
- 不要在该文件中导入使用
@ontologies/core
默认导出的任何包。 - 在文件中导入任何使用
@ontologies/core
默认导出的导入之前导入该文件。
非-js 符号
术语名称中的破折号被下划线替换。默认导出包含逐字和下划线值。
import dcterms, { ISO639_2 } from '@ontologies'
console.log(ISO639_2) // NamedNode(http://purl.org/dc/terms/ISO639-2)
console.log(dcterms.ISO639_2) // NamedNode(http://purl.org/dc/terms/ISO639-2)
console.log(dcterms['ISO639-2']) // NamedNode(http://purl.org/dc/terms/ISO639-2)
与ES保留关键字冲突
对于JavaScript对象字面量,不存在保留的对象属性键,因此在使用默认导出时,可以直接访问术语
import schema from '@ontologies/schema'
console.log(schema.yield) // NamedNode(http://schema.org/name)
在使用命名导出时,如果术语与ES 5/6保留关键字或某些内置类冲突,则术语前面会添加本体的符号
import { name, schemayield } from '@ontologies/schema'
// 'name' is not a JS reserved keyword
console.log(name.value) // "http://schema.org/name"
// 'yield' is a reserved keyword, so the package name is prepended to the js identifier.
console.log(schemayield.value) // "http://schema.org/yield"