我正在使用 RDF4J 服务器和工作台版本 2.2.2。我在 RDF4J 中使用支持 SPIN 的存储库,并且正在阅读我在 TobBraid Composer 免费版 (TBC FE) 中创建的包含许多spin:construct
规则的 RDF 文件。TBD FE 设置为通过sp:text
属性包含我的构造函数的 SPARQL 源代码。我观察到,当sp:text
三元组存在使 SPARQL 源代码可用于 RDF4J 时,RDF4J 似乎使用 SPARQL 源而不是使用相同查询的 RDF 标记化表示。我的主要和次要问题是:
sp:text
当导入的 RDF 文件中同时存在 和 RDF 表示时,如何指示 RDF4J 使用 SPIN 构造函数的 RDF 表示?- 如果 RDF4J 使用
sp:text
SPIN 构造函数的表示,如何指示它使用出现在导入的 RDF 文件头部的前缀定义?到目前为止,我有 69 个构造函数并且还在增加。虽然我可以在每个构造函数中嵌入前缀定义,但这样做似乎很浪费。
当我剥夺 RDF4J 的sp:text
SPARQL 源代码表示时,构造函数会使用在导入的 RDF 文件头部定义的前缀按预期运行。在实例化我定义了构造函数的类之前,我可以通过执行删除源代码的查询来剥夺 RDF4J 的源代码。我已经使用这个 SPARQL 更新查询来完成这个目的:
PREFIX sp: <http://spinrdf.org/sp#>
DELETE {?s sp:text ?o .} WHERE {?s sp:text ?o .}
我想保留 SPARQL 源代码以在我正在构建的 GUI 中显示,该 GUI 通过 SPARQL 查询与 RDF4J 服务器通信。sp:text
我尴尬的临时解决方法是使用下面第 5 步中使用的 SPARQL 更新查询替换另一个自定义数据属性。此属性替换成功地阻止 RDF4J 找到 SPIN 构造函数的 SPARQL 源代码。然后 RDF4J 转而解释规则的标记化 RDF 表示。有没有更简洁的方法来强制 RDF4J 从 RDF 而不是从 SPARQL 源代码执行 SPIN 构造函数?我在想必须有某种方式来指示 RDF4J 来解释 RDF 表示而不是 SPARQL 源代码,但我不知道如何。
现在,让这种情况可重现的血腥细节......
- 使用 RDF4J 工作台在 RDF4J 中创建一个支持 SPIN 的存储库。我的名为 TakeRDF4J4SPIN(存储库→新存储库)
- 使用 RDF4J 工作台清除存储库(修改 → 清除)
- 使用 RDF4J 工作台加载pub7.rdf ...(修改 → 添加 w/ 使用基本 URI 作为上下文标识符未选中)
请注意,此 RDF 文件在文件开头定义了所有相关前缀:
<?xml version="1.0"?>
<rdf:RDF
xmlns:fn="http://www.w3.org/2005/xpath-functions#"
xmlns:soo="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#"
xmlns:spolicy="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:spin="http://spinrdf.org/spin#"
xmlns:sp="http://spinrdf.org/sp#"
xmlns:smf="http://topbraid.org/sparqlmotionfunctions#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:arg="http://spinrdf.org/arg#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:pub7="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:spl="http://spinrdf.org/spl#"
xml:base="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7">
另请注意,附加到该类的 SPIN 构造函数pub7:Pub7TestClass
是:
CONSTRUCT {
?this spin:hasConstraintViolation _:b0 .
_:b0 a spin:ConstraintViolation ;
rdfs:label "Test message." ;
spin:violationRoot ?this ;
spin:violationLevel spin:Error ;
spolicy:sPActionRecordHasTimestamp ?timestamp .
}
WHERE {
BIND(now() AS ?timestamp) .
}
- 尝试创建
pub7:Pub7TestClass
...的实例
我在 RDF4J 工作台的 Modify → SPARQL Update 中使用这个 SPARQL 更新查询来创建实例...
PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>
PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#>
INSERT DATA {
inst:aPub7TestClassInstance_test1 a pub7:Pub7TestClass .
}
由于尝试基于sp:text
SPARQL 源代码表示执行上述构造函数,这将导致在 RDF4J 工作台中报告前缀未定义错误:
org.eclipse.rdf4j.query.UpdateExecutionException: org.eclipse.rdf4j.repository.RepositoryException: org.eclipse.rdf4j.sail.SailException: org.eclipse.rdf4j.query.MalformedQueryException: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: QName 'spin:hasConstraintViolation' uses an undefined prefix
sp:text
现在使用以下 SPARQL 更新查询从 RDF4J 中隐藏 SPIN 构造函数:
.
PREFIX sp: <http://spinrdf.org/sp#>
PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#>
DELETE {
?originalPolicyURI sp:systemProperty ?policySourceCodeString .
?originalPolicyURI sp:text ?policySourceCodeString .
}
INSERT {
?originalPolicyURI soo:policySourceCode ?policySourceCodeString .
}
WHERE {
?originalPolicyURI sp:text ?policySourceCodeString .
}
现在重新运行步骤 4 中显示的 SPARQL 更新查询以实例化测试类。这次更新查询应该没有错误地运行。
现在使用 RDF4J Workbench 的 Explore → Explore 函数来查看我们刚刚创建的实例化/个体,
inst:aPub7TestClassInstance_test1
. 应该看到实例化通过spin:hasConstratintViolation
属性有一个约束违反通知,提供了测试构造函数这次确实在没有sp:text
表示的情况下运行的证据,被迫使用 SPIN 构造函数的 RDF 标记化表示。