如何使用SHACL对对象化后的日期属性进行比较校验?
使用SHACL校验对象化后的日期比较问题
简单场景的实现
直接通过sh:lessThan就能实现出生年份早于死亡年份的校验,写法简洁明了:
数据示例
@prefix ex: <http://example.org/> . ex:patient1 a ex:Patient ; ex:hasBirthDate "2000"^^xsd:gYear ; ex:hasDeathDate "1999"^^xsd:gYear .
SHACL形状定义
@prefix sh: <http://www.w3.org/ns/shacl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix ex: <http://example.org/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . ex:PatientBirthDateShape a sh:NodeShape ; sh:targetClass ex:Patient ; sh:property [ sh:path ex:hasBirthDate ; sh:lessThan ex:hasDeathDate ; ] .
对象化日期后的校验难题
当把日期拆分为独立的BirthDate/DeathDate对象后,原有写法无法正确定位对应年份:
数据示例
@prefix sh: <http://www.w3.org/ns/shacl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix ex: <http://example.org/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . ex:patient a ex:Patient ; ex:hasDate ex:birthdate1, ex:deathdate1 . ex:birthdate1 a ex:BirthDate ; ex:hasYear "2000"^^xsd:gYear . ex:deathdate1 a ex:DeathDate ; ex:hasYear "1999"^^xsd:gYear .
尝试的嵌套写法可读性差且无法正常工作:
@prefix sh: <http://www.w3.org/ns/shacl#> . @prefix ex: <http://example.org/> . ex:PatientBirthDateShape a sh:NodeShape ; sh:targetClass ex:Patient ; sh:property [ sh:path ex:hasDate ; sh:node [ a sh:NodeShape ; sh:targetClass ex:BirthDate ; sh:property [ sh:path ex:hasYear ; sh:lessThan [ a sh:NodeShape ; sh:targetClass ex:DeathDate ; sh:property [ sh:path ex:hasYear ] ] ] ] ] .
简洁解决方案:路径表达式 + sh:lessThanPath
无需复杂的SPARQL,用SHACL路径表达式结合sh:lessThanPath就能精准定位并比较目标值:
正确的SHACL形状定义
@prefix sh: <http://www.w3.org/ns/shacl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix ex: <http://example.org/> . ex:PatientBirthDateShape a sh:NodeShape ; sh:targetClass ex:Patient ; sh:property [ # 定位当前Patient下BirthDate对象的hasYear值 sh:path (ex:hasDate [ a ex:BirthDate ] ex:hasYear) ; # 用路径指向同Patient下DeathDate对象的hasYear值进行比较 sh:lessThanPath (ex:hasDate [ a ex:DeathDate ] ex:hasYear) ; ] .
核心逻辑
(ex:hasDate [ a ex:BirthDate ] ex:hasYear):从Patient节点出发,通过路径筛选出类型为ex:BirthDate的关联对象,再提取其ex:hasYear属性值。sh:lessThanPath:与sh:lessThan功能一致,但支持用路径表达式指定比较目标,完美适配对象化后的结构,写法简洁直观。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

