Rdf SHACL是否比较两个不同节点上的值?

Rdf SHACL是否比较两个不同节点上的值?,rdf,shacl,Rdf,Shacl,我试图为开始日期必须小于或等于结束日期的日期比较编写一个SHACL约束。使用:beginDate和:endDate谓词将日期附加到同一节点时,约束是直接的: :StartEndRuleShape a :PropertyShape ; sh:path :beginDate ; sh:lessThanOrEquals :endDate ; sh:message "Begin Date is after End Date." . 现实世界的模型更为复杂。在附

我试图为开始日期必须小于或等于结束日期的日期比较编写一个SHACL约束。使用
:beginDate
:endDate
谓词将日期附加到同一节点时,约束是直接的:

:StartEndRuleShape a :PropertyShape  ;
  sh:path              :beginDate ;
  sh:lessThanOrEquals  :endDate ;
  sh:message "Begin Date is after End Date." .
现实世界的模型更为复杂。在附图中,请注意
:AnimalSubject
如何具有referenceinterval
。ReferenceInterval IRIs有一个
:ReferenceBegin
和一个
:ReferenceEnd
,它们依次使用
时间:inXSDDate
谓词分配日期值。在这种情况下,如何应用约束以确保ReferenceBegin值等于或小于ReferenceEnd值?这是使用SHACL-SPARQL或sequencePath的情况吗?我找不到这两个方面的好例子。 干杯

我在违反约束的数据上测试了以下SHACL-SPARQL:ReferenceBegin=“2016-12-07”,ReferenceEnd=“2016-12-06”,但验证报告没有检测到违反。如果我自己运行SPARQL,它确实会找出观察结果。有什么想法吗?我正在使用Stardog/Stardog Studio,并且已经发布在他们的用户支持平台上

@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix sh:  <http://www.w3.org/ns/shacl#> .
@prefix time: <http://www.w3.org/2006/time#> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix :     <http://foo.bar.org/> .

:IntervalShape a sh:NodeShape ;
 sh:targetClass :ReferenceInterval ;
 sh:sparql [
  a sh:SPARQLConstraint ;
  sh:message "End Date must be greater than or equal to Begin Date";
  sh:prefixes [
    sh:declare [
      sh:prefix "time" ;
      sh:namespace "http://www.w3.org/2006/time#"^^xsd:anyURI ;
    ] 
  ] ;
 sh:select
  """SELECT $this (?beginDate AS ?intervalStart) (?endDate AS ?intervalEnd)
    WHERE {
      $this     :hasReferenceInterval ?interval .
      ?interval :ReferenceBegin       ?beginIRI ;
                :ReferenceEnd         ?endIRI .
      ?beginIRI time:inXSDDate        ?beginDate .
      ?endIRI   time:inXSDDate        ?endDate .
      FILTER  (! (?endDate >= ?beginDate ))
    }""" ;
] .
@前缀rdf:。
@前缀sh:。
@前缀时间:。
@前缀xsd:。
@前缀:。
:间隔形状a sh:NodeShape;
sh:targetClass:ReferenceInterval;
sh:sparql[
sh:sparql约束;
sh:消息“结束日期必须大于或等于开始日期”;
sh:前缀[
上海:申报[
sh:前缀为“时间”;
sh:名称空间“http://www.w3.org/2006/time#“^^xsd:anyURI;
] 
] ;
sh:选择
“”“选择$this(?beginDate作为intervalStart)(?endDate作为intervalEnd)
在哪里{
$this:hasReferenceInterval?间隔。
?间隔:参考开始?开始;
:ReferenceEnd?endIRI。
?开始时间:inXSDDate?开始时间。
?endIRI时间:inXSDDate?endDate。
过滤器(!(?结束日期>=?开始日期))
}""" ;
] .

您的约束似乎有两个问题:

  • 您可以在SHACL中声明
    time
    前缀,但不能声明
    base
    前缀。你想要:

    sh:prefixes [
        sh:declare [
          sh:prefix "time" ;
          sh:namespace "http://www.w3.org/2006/time#"^^xsd:anyURI ;
        ], [
          sh:prefix "" ;
          sh:namespace "http://foo.bar.org/"^^xsd:anyURI ;
        ]
      ] ;
    
  • 您的焦点节点是
    :ReferenceInterval
    ,但是您的查询的编写方式,
    $this
    将只绑定到
    :hasReferenceInterval[a:ReferenceInterval]
    的实体。我重写了查询,因此
    ?interval
    现在是
    $this
    ,如下所示:

    sh:select
      """SELECT $this (?beginDate AS ?intervalStart) (?endDate AS ?intervalEnd)
        WHERE {
          $this     :ReferenceBegin       ?beginIRI ;
                    :ReferenceEnd         ?endIRI .
          ?beginIRI time:inXSDDate        ?beginDate .
          ?endIRI   time:inXSDDate        ?endDate .
          FILTER  (! (?endDate >= ?beginDate ))
        }""" ;
    
    添加此约束后,我可以看到违规情况


  • 这不是一个完整的回答,但对我来说这听起来像是SHACL-SPARQL。即使可以通过路径表达式获得这些值,sh:lessThanOrEquals的值也只能是简单的属性,而不是路径。我同意,霍尔格。我尝试了这个SHACL-SPARQL,但在我将ReferenceBegin设置为“2017-12-07”并将ReferenceEnd设置为“2017-12-06”的记录中没有检测到违规行为。我将用SHACL-SPARQL更新我的帖子。