如何验证 SHACL 中没有数据类型定义的文字值?

How to validate literal values with no datatype definition in SHACL?

我假设没有任何数据类型与具有 xsd:string 作为数据类型隐式相同,但是 SHACL 给了我一个验证错误。我的假设是错误的还是 SHACL 未涵盖?在后一种情况下,如何验证数据类型是空的还是 xsd:string?

string.ttl

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

<message> <title> "Hello World"@en.

shacl.ttl

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

:TitleShape rdf:type sh:NodeShape;
    sh:targetObjectsOf <title>;
    sh:datatype xsd:string;
    sh:closed true.

错误

$ pyshacl  string.ttl -s shacl.ttl
Validation Report
Conforms: False
Results (1):
Constraint Violation in DatatypeConstraintComponent (http://www.w3.org/ns/shacl#DatatypeConstraintComponent):
    Severity: sh:Violation
    Source Shape: :TitleShape
    Focus Node: Literal("Hello World", lang=en)
    Value Node: Literal("Hello World", lang=en)
    Message: Value is not Literal with datatype xsd:string

在您的示例中,数据包含一个 rdf:langString 文字,它与 xsd:string 的数据类型不同 - 您会看到 @en 语言标记。您可能指的是以下内容是等效的:“Hello World”和“Hello World”^^xsd:string。所以上面的 pyshacl 结果对我来说是正确的。