简体   繁体   中英

SHACL: Require sh:property to be a URI

I was wondering if there's a way to specify that a given sh:property is expected to have a value of a URI without any particular class.

In the example SHACL below, the property meta:value would only allow URIs, although I don't know of a way to represent it in SHACL.

Example SHACL

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

@prefix meta: <metadata#> .
@prefix meta_sh: <metadata/shacl#> .

meta_sh:Entry
    a sh:NodeShape;
    sh:targetClass meta:Entry;
    sh:property [
        sh:path meta:value;
        # Value expected to be a URI
        sh:minCount 1; # Required; 1 or more
    ];
    sh:property [
        sh:path meta:time;
        sh:datatype xsd:dateTime;
        sh:minCount 1; sh:maxCount 1; # Required; 1
    ];
    .

Example Data

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

@prefix meta: <metadata#> .
@prefix data: <data#> .

data:Entry_001
    a meta:Entry;
    meta:value data:ProductListing_459; # URI
    meta:value data:RentalListing_934; # URI
    meta:time "2022-06-15T06:20:31Z"^^xsd:dateTime;
    .

this should work:

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

@prefix meta: <metadata#> .
@prefix meta_sh: <metadata/shacl#> .

meta_sh:Entry
    a sh:NodeShape;
    sh:targetClass meta:Entry;
    sh:nodeKind sh:IRI ;
    sh:property [
        sh:path meta:value;
        # Value expected to be a URI
        sh:minCount 1; # Required; 1 or more
    ];
    sh:property [
        sh:path meta:time;
        sh:datatype xsd:dateTime;
        sh:minCount 1; sh:maxCount 1; # Required; 1
    ];
    .

Yes, you are right, the sh:nodeKind has to be part of the property shape.

The reason why it still not worked: the way you defined the prefixes. They were no full URIs so the SHACL processor added some parts (maybe the disk location of the file, depends). The result: the meta in the shapes never matched the meta in the data.

This works:

SHACL

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

@prefix meta: <https://example.org/#> .
@prefix meta_sh: <metadata/shacl#> .

meta_sh:Entry
    a sh:NodeShape;
    sh:targetClass meta:Entry;
    sh:property [
        sh:path meta:value;
        sh:nodeKind sh:IRI ;
        sh:minCount 1; # Required; 1 or more
    ];
.

Data

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

@prefix meta: <https://example.org/#> .
@prefix data: <data#> .

data:Entry_001
    a meta:Entry;
    meta:value data:RentalListing_934 ; # URI
    meta:time "2022-06-15T06:20:31Z"^^xsd:dateTime;
.

data:Entry_002
    a meta:Entry;
    meta:value "this is not an uri" ; # No Uri
    meta:time "2022-06-15T06:20:31Z"^^xsd:dateTime;
.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM