1

我正在使用 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:textSPIN 构造函数的表示,如何指示它使用出现在导入的 RDF 文件头部的前缀定义?到目前为止,我有 69 个构造函数并且还在增加。虽然我可以在每个构造函数中嵌入前缀定义,但这样做似乎很浪费。

当我剥夺 RDF4J 的sp:textSPARQL 源代码表示时,构造函数会使用在导入的 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 源代码,但我不知道如何。

现在,让这种情况可重现的血腥细节......

  1. 使用 RDF4J 工作台在 RDF4J 中创建一个支持 SPIN 的存储库。我的名为 TakeRDF4J4SPIN(存储库→新存储库)
  2. 使用 RDF4J 工作台清除存储库(修改 → 清除)
  3. 使用 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) .
}
  1. 尝试创建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:textSPARQL 源代码表示执行上述构造函数,这将导致在 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
  1. 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 . 
}
  1. 现在重新运行步骤 4 中显示的 SPARQL 更新查询以实例化测试类。这次更新查询应该没有错误地运行。

  2. 现在使用 RDF4J Workbench 的 Explore → Explore 函数来查看我们刚刚创建的实例化/个体,inst:aPub7TestClassInstance_test1. 应该看到实例化通过spin:hasConstratintViolation属性有一个约束违反通知,提供了测试构造函数这次确实在没有sp:text表示的情况下运行的证据,被迫使用 SPIN 构造函数的 RDF 标记化表示。

4

1 回答 1

0

我有一个部分的、不优雅的解决方法来解决我关于在旋转规则中包含前缀的第二个问题。作为初始化步骤,我运行以下 SPARQL 更新查询,为每个sp:text字符串添加所需的前缀。当然,这种解决方法是有限的,因为查询嵌入了我正在使用的前缀映射。如果需要其他前缀,则需要编辑下面的查询以嵌入新的查询定义。

这是在我的类/规则/属性定义本体被加载到 RDF4J 之后但在我加载我的实例化本体之前,我用作初始化步骤的 SPARQL 更新查询。(时间很关键,因为实例化本体开始调用 SPIN 构造函数。)

PREFIX sp: <http://spinrdf.org/sp#>

DELETE { 
    ?rule sp:text ?ruleText . 
} 
INSERT { 
    ?rule sp:text ?newRuleText . 
} 
WHERE { 
    ?rule sp:text ?ruleText . 
    BIND (IF (CONTAINS(?ruleText, "fn:"),      "PREFIX fn: <http://www.w3.org/2005/xpath-functions#>\n","") 
        AS ?prefixComponent00) . 
    BIND (IF (CONTAINS(?ruleText, "owl:"),     "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n","")
        AS ?prefixComponent01) . 
    BIND (IF (CONTAINS(?ruleText, "spin:"),    "PREFIX spin: <http://spinrdf.org/spin#>\n","")
        AS ?prefixComponent02) . 
    BIND (IF (CONTAINS(?ruleText, "spl:"),     "PREFIX spl: <http://spinrdf.org/spl#>\n","")
        AS ?prefixComponent03) . 
    BIND (IF (CONTAINS(?ruleText, "sp:"),      "PREFIX sp: <http://spinrdf.org/sp#>\n","")
        AS ?prefixComponent04) . 
    BIND (IF (CONTAINS(?ruleText, "par:"),     "PREFIX par: <http://parliament.semwebcentral.org/parliament#>\n","")
        AS ?prefixComponent05) . 
    BIND (IF (CONTAINS(?ruleText, "rdf:"),     "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n","")
        AS ?prefixComponent06) . 
    BIND (IF (CONTAINS(?ruleText, "rdfs:"),    "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n","")
        AS ?prefixComponent07) . 
    BIND (IF (CONTAINS(?ruleText, "time:"),    "PREFIX time: <http://www.w3.org/2006/time#>\n","")
        AS ?prefixComponent08) . 
    BIND (IF (CONTAINS(?ruleText, "xsd:"),     "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n","")
        AS ?prefixComponent09) . 
    BIND (IF (CONTAINS(?ruleText, "geo:"),     "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n","")
        AS ?prefixComponent10) . 
    BIND (IF (CONTAINS(?ruleText, "geof:"),    "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n:","")
        AS ?prefixComponent11) . 
    BIND (IF (CONTAINS(?ruleText, "inst:"),    "PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>\n","")
        AS ?prefixComponent12) . 
    BIND (IF (CONTAINS(?ruleText, "pub7:"),    "PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#>\n","")
        AS ?prefixComponent13) . 
    BIND (IF (CONTAINS(?ruleText, "pub8:"),    "PREFIX pub8: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub8#>\n","")
        AS ?prefixComponent14) . 
    BIND (IF (CONTAINS(?ruleText, "soo:"),     "PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#>\n","")
        AS ?prefixComponent15) . 
    BIND (IF (CONTAINS(?ruleText, "spolicy:"), "PREFIX spolicy: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#>\n","")
        AS ?prefixComponent16) . 
    BIND (IF (CONTAINS(?ruleText, "sharing:"), "PREFIX sharing: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/sharing#>\n","")
        AS ?prefixComponent17) . 
    BIND (IF (CONTAINS(?ruleText, "dd1494:"),  "PREFIX dd1494: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/dd1494#>\n","")
        AS ?prefixComponent18) . 
    BIND (IF (CONTAINS(?ruleText, "Nuvio:"),   "PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>\n","")
        AS ?prefixComponent19) . 
    BIND (IF (CONTAINS(?ruleText, "CRO2:"),    "PREFIX CRO2: <http://cogradio.org/ont/CRO2.owl#>\n","")
        AS ?prefixComponent20) . 
    BIND (IF (CONTAINS(?ruleText, "olo:"),     "PREFIX olo: <http://purl.org/ontology/olo/core#>\n","")
        AS ?prefixComponent21) . 
    BIND (CONCAT( 
      ?prefixComponent00, 
      ?prefixComponent01, 
      ?prefixComponent02, 
      ?prefixComponent03, 
      ?prefixComponent04, 
      ?prefixComponent05, 
      ?prefixComponent06, 
      ?prefixComponent07, 
      ?prefixComponent08, 
      ?prefixComponent09, 
      ?prefixComponent10, 
      ?prefixComponent11, 
      ?prefixComponent12, 
      ?prefixComponent13, 
      ?prefixComponent14, 
      ?prefixComponent15, 
      ?prefixComponent16, 
      ?prefixComponent17, 
      ?prefixComponent18, 
      ?prefixComponent19, 
      ?prefixComponent20, 
      ?prefixComponent21 
      ) AS ?prefixes ) . 
    BIND (CONCAT(?prefixes, "\n", ?ruleText) AS ?newRuleText) . 
}

如果前缀定义恰好包含在嵌入的字符串或注释中,则上述查询可能包含基于误报的前缀定义。例如,文字"Greg’s solo: five measures"^^xsd:string会导致上述查询包含olo:前缀的定义,这可能是不必要的。但是,包含非必需前缀对性能没有重大影响,对正确性也没有影响。CONTAINS通过使用正则表达式代替上面查询中的简单匹配,可以做得更好。

于 2017-09-13T00:34:35.540 回答