dbpedia / gstore

Git repo / triple store hybrid graph storage
Apache License 2.0
3 stars 0 forks source link

shacl validation broken #30

Closed holycrab13 closed 1 year ago

holycrab13 commented 1 year ago

Java Stacktrace:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map devenv_gstore | at org.dbpedia.databus.RdfConversions$.jsonLdContextUriString(SparqlClient.scala:308) devenv_gstore | at org.dbpedia.databus.RdfConversions$.contextUri(SparqlClient.scala:303) devenv_gstore | at org.dbpedia.databus.RdfConversions$.$anonfun$validateWithShacl$2(SparqlClient.scala:206) devenv_gstore | at scala.util.Success.$anonfun$map$1(Try.scala:251) devenv_gstore | at scala.util.Success.map(Try.scala:209) devenv_gstore | at org.dbpedia.databus.RdfConversions$.validateWithShacl(SparqlClient.scala:205) devenv_gstore | at org.dbpedia.databus.ApiImpl.shaclValidate(ApiImpl.scala:84) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.$anonfun$new$12(DefaultApi.scala:195) devenv_gstore | at org.scalatra.ScalatraBase.liftAction(ScalatraBase.scala:280) devenv_gstore | at org.scalatra.ScalatraBase.$anonfun$invoke$1(ScalatraBase.scala:274) devenv_gstore | at org.scalatra.ApiFormats.withRouteMultiParams(ApiFormats.scala:183) devenv_gstore | at org.scalatra.ApiFormats.withRouteMultiParams$(ApiFormats.scala:169) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRouteMultiParams(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraBase.invoke(ScalatraBase.scala:273) devenv_gstore | at org.scalatra.ScalatraBase.invoke$(ScalatraBase.scala:272) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.org$scalatra$json$JsonSupport$$super$invoke(DefaultApi.scala:32) devenv_gstore | at org.scalatra.json.JsonSupport.$anonfun$invoke$1(JsonSupport.scala:90) devenv_gstore | at org.scalatra.ApiFormats.withRouteMultiParams(ApiFormats.scala:183) devenv_gstore | at org.scalatra.ApiFormats.withRouteMultiParams$(ApiFormats.scala:169) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRouteMultiParams(DefaultApi.scala:32) devenv_gstore | at org.scalatra.json.JsonSupport.invoke(JsonSupport.scala:84) devenv_gstore | at org.scalatra.json.JsonSupport.invoke$(JsonSupport.scala:83) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.invoke(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraBase.$anonfun$runRoutes$3(ScalatraBase.scala:248) devenv_gstore | at scala.Option.flatMap(Option.scala:171) devenv_gstore | at org.scalatra.ScalatraBase.$anonfun$runRoutes$1(ScalatraBase.scala:246) devenv_gstore | at scala.collection.immutable.Stream.flatMap(Stream.scala:486) devenv_gstore | at org.scalatra.ScalatraBase.runRoutes(ScalatraBase.scala:245) devenv_gstore | at org.scalatra.ScalatraBase.runRoutes$(ScalatraBase.scala:243) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.runRoutes(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraBase.runActions$1(ScalatraBase.scala:169) devenv_gstore | at org.scalatra.ScalatraBase.$anonfun$executeRoutes$6(ScalatraBase.scala:181) devenv_gstore | at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) devenv_gstore | at org.scalatra.ScalatraBase.cradleHalt(ScalatraBase.scala:199) devenv_gstore | at org.scalatra.ScalatraBase.executeRoutes(ScalatraBase.scala:181) devenv_gstore | at org.scalatra.ScalatraBase.executeRoutes$(ScalatraBase.scala:150) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.executeRoutes(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraBase.$anonfun$handle$1(ScalatraBase.scala:123) devenv_gstore | at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) devenv_gstore | at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withResponse(DynamicScope.scala:79) devenv_gstore | at org.scalatra.DynamicScope.withResponse$(DynamicScope.scala:77) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withResponse(DefaultApi.scala:32) devenv_gstore | at org.scalatra.DynamicScope.$anonfun$withRequestResponse$1(DynamicScope.scala:59) devenv_gstore | at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withRequest(DynamicScope.scala:70) devenv_gstore | at org.scalatra.DynamicScope.withRequest$(DynamicScope.scala:68) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRequest(DefaultApi.scala:32) devenv_gstore | at org.scalatra.DynamicScope.withRequestResponse(DynamicScope.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withRequestResponse$(DynamicScope.scala:56) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRequestResponse(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraBase.handle(ScalatraBase.scala:123) devenv_gstore | at org.scalatra.ScalatraBase.handle$(ScalatraBase.scala:119) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.org$scalatra$servlet$ServletBase$$super$handle(DefaultApi.scala:32) devenv_gstore | at org.scalatra.servlet.ServletBase.handle(ServletBase.scala:53) devenv_gstore | at org.scalatra.servlet.ServletBase.handle$(ServletBase.scala:46) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.org$scalatra$servlet$FileUploadSupport$$super$handle(DefaultApi.scala:32) devenv_gstore | at org.scalatra.servlet.FileUploadSupport.handle(FileUploadSupport.scala:95) devenv_gstore | at org.scalatra.servlet.FileUploadSupport.handle$(FileUploadSupport.scala:80) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.org$scalatra$CorsSupport$$super$handle(DefaultApi.scala:32) devenv_gstore | at org.scalatra.CorsSupport.$anonfun$handle$1(CORSSupport.scala:221) devenv_gstore | at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) devenv_gstore | at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withResponse(DynamicScope.scala:79) devenv_gstore | at org.scalatra.DynamicScope.withResponse$(DynamicScope.scala:77) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withResponse(DefaultApi.scala:32) devenv_gstore | at org.scalatra.DynamicScope.$anonfun$withRequestResponse$1(DynamicScope.scala:59) devenv_gstore | at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withRequest(DynamicScope.scala:70) devenv_gstore | at org.scalatra.DynamicScope.withRequest$(DynamicScope.scala:68) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRequest(DefaultApi.scala:32) devenv_gstore | at org.scalatra.DynamicScope.withRequestResponse(DynamicScope.scala:58) devenv_gstore | at org.scalatra.DynamicScope.withRequestResponse$(DynamicScope.scala:56) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.withRequestResponse(DefaultApi.scala:32) devenv_gstore | at org.scalatra.CorsSupport.handle(CORSSupport.scala:209) devenv_gstore | at org.scalatra.CorsSupport.handle$(CORSSupport.scala:206) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.handle(DefaultApi.scala:32) devenv_gstore | at org.scalatra.ScalatraServlet.service(ScalatraServlet.scala:65) devenv_gstore | at org.scalatra.ScalatraServlet.service$(ScalatraServlet.scala:64) devenv_gstore | at org.dbpedia.databus.swagger.api.DefaultApi.service(DefaultApi.scala:32) devenv_gstore | at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) devenv_gstore | at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:856) devenv_gstore | at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) devenv_gstore | at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) devenv_gstore | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) devenv_gstore | at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) devenv_gstore | at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) devenv_gstore | at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) devenv_gstore | at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) devenv_gstore | at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155) devenv_gstore | at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) devenv_gstore | at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219) devenv_gstore | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) devenv_gstore | at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335) devenv_gstore | at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) devenv_gstore | at org.eclipse.jetty.server.Server.handle(Server.java:531) devenv_gstore | at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352) devenv_gstore | at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260) devenv_gstore | at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281) devenv_gstore | at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102) devenv_gstore | at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) devenv_gstore | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:319) devenv_gstore | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:175) devenv_gstore | at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:133) devenv_gstore | at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) devenv_gstore | at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:754) devenv_gstore | at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:672) devenv_gstore | at java.lang.Thread.run(Thread.java:748)

request:

formData: {
      graph: '[{"@id":"http://localhost:3000/janfo/asdf","@type":["http://dataid.dbpedia.org/ns/core#Group"],"http://purl.org/dc/terms/abstract":[{"@value":"asdfasdfsadfasdfasdfasdfasdfasdfasdffs"}],"http://purl.org/dc/terms/description":[{"@value":"sadfasdfsadfasdfsadfasdfasdfsadsafsad"}],"http://purl.org/dc/terms/title":[{"@value":"asdf"}]},{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28#Dataset","@type":["http://dataid.dbpedia.org/ns/core#Dataset"],"http://purl.org/dc/terms/abstract":[{"@value":"dsfgsdfgsdfgsdfgsdgfsdgfdsgfdsfg"}],"http://purl.org/dc/terms/description":[{"@value":"sdfgdsfgsdgfsdfgsdgfsdgsdgfsdgfsdfgdsf"}],"http://purl.org/dc/terms/hasVersion":[{"@value":"2022-09-28"}],"http://purl.org/dc/terms/license":[{"@id":"http://dalicc.net/licenselibrary/ApplePublicSourceLicense20"}],"http://purl.org/dc/terms/title":[{"@value":"sdgsdfgsdfgsdg"}],"http://www.w3.org/ns/dcat#distribution":[{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28#dsfg.ttl"}],"http://purl.org/dc/terms/publisher":[{"@id":"http://localhost:3000/janfo#this"}],"http://dataid.dbpedia.org/ns/core#group":[{"@id":"http://localhost:3000/janfo/asdf"}],"http://dataid.dbpedia.org/ns/core#artifact":[{"@id":"http://localhost:3000/janfo/asdf/dsfg"}],"http://dataid.dbpedia.org/ns/core#version":[{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28"}],"http://purl.org/dc/terms/issued":[{"@type":"http://www.w3.org/2001/XMLSchema#dateTime","@value":"2022-09-28T12:48:09.706Z"}],"http://purl.org/dc/terms/modified":[{"@type":"http://www.w3.org/2001/XMLSchema#dateTime","@value":"2022-09-28T12:48:09.706Z"}]},{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28#dsfg.ttl","@type":["http://dataid.dbpedia.org/ns/core#Part"],"http://dataid.dbpedia.org/ns/core#compression":[{"@value":"none"}],"http://dataid.dbpedia.org/ns/core#formatExtension":[{"@value":"ttl"}],"http://www.w3.org/ns/dcat#downloadURL":[{"@id":"https://holycrab13.github.io/webid.ttl"}],"http://purl.org/dc/terms/hasVersion":[{"@value":"2022-09-28"}],"http://purl.org/dc/terms/issued":[{"@type":"http://www.w3.org/2001/XMLSchema#dateTime","@value":"2022-09-28T12:48:09.706Z"}],"http://purl.org/dc/terms/modified":[{"@type":"http://www.w3.org/2001/XMLSchema#dateTime","@value":"2022-09-28T12:48:09.706Z"}],"http://dataid.dbpedia.org/ns/core#file":[{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28/dsfg.ttl"}],"http://dataid.dbpedia.org/ns/core#sha256sum":[{"@value":"d61a05ca4810367f361f17500304a168aab27a3119c93a18c00bce1775dfd6b1"}],"http://www.w3.org/ns/dcat#byteSize":[{"@value":2730,"@type":"http://www.w3.org/2001/XMLSchema#decimal"}]},{"@id":"http://localhost:3000/janfo/asdf/dsfg/2022-09-28","@type":"http://dataid.dbpedia.org/ns/core#Version"},{"@id":"http://localhost:3000/janfo/asdf/dsfg","@type":"http://dataid.dbpedia.org/ns/core#Artifact"}]',
      shacl: [ReadStream]
    },
    method: 'POST',
    uri: 'http://localhost:3002/shacl/validate',
    headers: {
      'Content-Type': 'multipart/form-data',
      Accept: 'application/ld+json'
    },
holycrab13 commented 1 year ago
@prefix dash: <http://datashapes.org/dash#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dataid: <http://dataid.dbpedia.org/ns/core#> .
@prefix dct:   <http://purl.org/dc/terms/> .
@prefix dcat:  <http://www.w3.org/ns/dcat#> .
@prefix dcv: <http://dataid.dbpedia.org/ns/cv#> .
@prefix db: <https://databus.dbpedia.org/sys/ont/> .

<#group-exists>
    a sh:NodeShape ;
    sh:targetNode dataid:Group ;
    sh:property [
      sh:path [ sh:inversePath rdf:type ] ;
      sh:minCount 1 ;
      sh:maxCount 1;
      sh:message "Exactly one subject with an rdf:type of dataid:Group must occur."@en ;
    ] ;
    sh:property [
      sh:path [ sh:inversePath rdf:type ] ;
        sh:nodekind sh:IRI ;
      sh:pattern "/[a-zA-Z0-9\\-_]{4,}/[a-zA-Z0-9\\-_\\.]{3,}$" ;
      sh:message "IRI for dataid:Group must match /USER/GROUP , |USER|>3"@en ;
    ] .

<#title-group>
    a sh:NodeShape ;
    sh:targetClass dataid:Group ;
    sh:property [
        sh:path dct:title ;
        sh:severity sh:Violation ;
        sh:message "Required property dct:title MUST occur exactly once without language tag."@en ;
        sh:qualifiedValueShape [ sh:datatype xsd:string ] ;
        sh:qualifiedMinCount 1 ;
        sh:qualifiedMaxCount 1 ;        
    ] ;
        sh:property [
        sh:path dct:title ;
        sh:severity sh:Violation ;
        sh:message "Besides the required occurance of dct:title without language tag, dct:title can be used with language tag, but each language only once."@en ;
        sh:uniqueLang true ;
    ] . 

<#abstract-group>
    a sh:NodeShape ;
    sh:targetClass dataid:Group ;
    sh:property [
        sh:path dct:abstract ;
        sh:severity sh:Violation ;
        sh:message "Required property dct:abstract MUST occur at least once without language tag."@en ;
        sh:qualifiedValueShape [ sh:datatype xsd:string ] ;
        sh:qualifiedMinCount 1 ;
        sh:qualifiedMaxCount 1 ;    
    ];
    sh:property [
        sh:path dct:abstract ;
        sh:severity sh:Violation ;
        sh:message "Besides the required occurance of dct:abstract without language tag, each occurance of dct:abstract must have less than 200 characters and each language must occure only once. "@en ;
        sh:uniqueLang true;
        sh:maxLength 200 ;
    ] . 

<#description-group>
    a sh:NodeShape ;
    sh:targetClass dataid:Group ;
    sh:property [
        sh:path dct:description ;
        sh:severity sh:Violation ;
        sh:message "Required property dct:description MUST occur exactly once without language tag."@en ;
        sh:qualifiedValueShape [ sh:datatype xsd:string ] ;
        sh:qualifiedMinCount 1 ;
        sh:qualifiedMaxCount 1 ;        
    ] ;
        sh:property [
        sh:path dct:description ;
        sh:severity sh:Violation ;
        sh:message "Besides the required occurance of dct:description without language tag, dct:title can be used with language tag, but each language only once."@en ;
        sh:uniqueLang true ;
    ] . 
manonthegithub commented 1 year ago

should be fixed

holycrab13 commented 1 year ago

Still have the issue on the current dev branch

08:47:59.968 WARN  ROOT - org.dbpedia.databus.swagger.api.DefaultApi: Error processing request
devenv_gstore    | java.lang.NullPointerException: null
devenv_gstore    |  at org.dbpedia.databus.RdfConversions$.$anonfun$jsonLdContextUriString$2(SparqlClient.scala:314)
devenv_gstore    |  at scala.Option.map(Option.scala:146)
devenv_gstore    |  at org.dbpedia.databus.RdfConversions$.jsonLdContextUriString(SparqlClient.scala:314)
devenv_gstore    |  at org.dbpedia.databus.RdfConversions$.contextUri(SparqlClient.scala:304)

for

{
  "@graph": [
    {
      "@id": "http://localhost:3000/jansen#this",
      "@type": [
        "http://xmlns.com/foaf/0.1/Person",
        "http://dbpedia.org/ontology/DBpedian"
      ],
      "http://xmlns.com/foaf/0.1/account": {
        "@id": "http://localhost:3000/jansen"
      },
      "http://xmlns.com/foaf/0.1/img": {
        "@id": ""
      },
      "http://xmlns.com/foaf/0.1/name": "Jan F."
    },
    {
      "@id": "http://localhost:3000/jansen",
      "@type": "http://xmlns.com/foaf/0.1/PersonalProfileDocument",
      "http://xmlns.com/foaf/0.1/maker": {
        "@id": "http://localhost:3000/jansen#this"
      },
      "http://xmlns.com/foaf/0.1/primaryTopic": {
        "@id": "http://localhost:3000/jansen#this"
      }
    }
  ]
}

against


@prefix dash: <http://datashapes.org/dash#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dataid: <http://dataid.dbpedia.org/ns/core#> .
@prefix dct:   <http://purl.org/dc/terms/> .
@prefix dcat:  <http://www.w3.org/ns/dcat#> .
@prefix dcv: <http://dataid.dbpedia.org/ns/cv#> .
@prefix db: <https://databus.dbpedia.org/sys/ont/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

##########
# Account
##########

<#person-exists>
  a sh:NodeShape ;
  sh:targetNode foaf:Person ; 
  sh:property [
      sh:path [ sh:inversePath rdf:type ] ;
      sh:minCount 1 ;
      sh:maxCount 1;
      sh:message "Exactly one subject with an rdf:type of foaf:Person must occur."@en ;
  ] .

<#profile-exists>
  a sh:NodeShape ;
  sh:targetNode foaf:PersonalProfileDocument ; 
  sh:property [
      sh:path [ sh:inversePath rdf:type ] ;
      sh:minCount 1 ;
      sh:maxCount 1;
      sh:message "Exactly one subject with an rdf:type of foaf:PersonalProfileDocument must occur."@en ;
  ] .

<#foaf-maker>   
    a sh:PropertyShape ;
    sh:targetClass foaf:PersonalProfileDocument ;
    sh:severity sh:Violation ;
    sh:message "Required property foaf:maker MUST occur exactly once in foaf:PersonalProfileDocument."@en ;
    sh:path foaf:maker ;
    sh:minCount 1 ;
    sh:maxCount 1 .

<#foaf-primary-topic>   
  a sh:PropertyShape ;
  sh:targetClass foaf:PersonalProfileDocument ;
  sh:severity sh:Violation ;
  sh:message "Required property foaf:primaryTopic MUST occur exactly once in foaf:PersonalProfileDocument."@en ;
  sh:path foaf:primaryTopic ;
  sh:minCount 1 ;
  sh:maxCount 1 .

<#foaf-primary-topic-target>   
  a sh:PropertyShape ;
  sh:targetClass foaf:PersonalProfileDocument ;
  sh:severity sh:Violation ;
  sh:message "Object of foaf:primaryTopic must be of type foaf:Person."@en ;
  sh:path foaf:primaryTopic ;
  sh:class foaf:Person .

<#foaf-account-target>   
  a sh:PropertyShape ;
  sh:targetClass foaf:Person ;
  sh:severity sh:Violation ;
  sh:message "Object of foaf:account must be of type foaf:PersonalProfileDocument."@en ;
  sh:path foaf:account ;
  sh:class foaf:PersonalProfileDocument .

<#foaf-account>   
  a sh:PropertyShape ;
  sh:targetClass foaf:Person ;
  sh:severity sh:Violation ;
  sh:message "Required property foaf:account MUST occur exactly once in foaf:Person."@en ;
  sh:path foaf:account ;
  sh:minCount 1 ;
  sh:maxCount 1 .

<#foaf-name>   
  a sh:PropertyShape ;
  sh:targetClass foaf:Person ;
  sh:severity sh:Violation ;
  sh:message "Required property foaf:name MUST be of type xsd:string and occur exactly once in foaf:Person."@en ;
  sh:path foaf:name ;
  sh:datatype xsd:string ;
  sh:minCount 1 ;
  sh:maxCount 1 .

<#foaf-img>   
  a sh:PropertyShape ;
  sh:targetClass foaf:Person ;
  sh:severity sh:Violation ;
  sh:message "Property foaf:img MUST be an IRI."@en ;
  sh:path foaf:img ;
  sh:nodeKind sh:IRI .
manonthegithub commented 1 year ago

@holycrab13 should be fixed now :). pls try again :)