Условие sh: только отфильтровывает узлы фокуса, к которым применяется правило, но не влияет на оценку объекта sh:. В вашем случае, не проверяя, я предполагаю, что ваш (один) узел фокусировки отображает: отношение_объект действительно выполняет условие, потому что одно из его значений соответствует QVS. Тем не менее, sh: выражение объекта по-прежнему оценивается для всех значений карт путей: hasOverlap / rdf: type, который затем предоставляет оба типа.
Один из вариантов будет express чем вам нужно в SPARQL и использовать правило на основе SPARQL.
Другой вариант - переместить логи c, находящиеся в состоянии sh:: в выражение sh: объектный узел. Я считаю sh: здесь можно использовать filterShape
https://w3c.github.io/shacl/shacl-af/#node -expressions-filter-shape
. Помните, что выражения узлов в основном представляют собой конвейеры, где узлы go находятся на одной стороне, а другие узлы go находятся на другой стороне. В вашем случае, я думаю, что вы хотите
- начать со всех значений карт: hasOverlap
- , а затем отфильтровать только те, к которым применяется ваша форма значения, то есть filterShape sh: и ( ex: mainAreaShape ex: secAreaShape)
- из них возвращают rdf: type
Извините, я не могу тратить больше времени на этот конкретный пример, но, возможно, это что-то вроде
sh:object [ # 3.
sh:path rdf:type ;
sh:nodes [ # 2.
sh:filterShape [
sh:nodeKind sh:BlankNode ;
sh:node ex:mainAreaShape, ex:secAreaShape ; # same as your sh:not
] ;
sh:nodes [ # 1.
sh:path maps:hasOverlap ;
]
]
]
Вам необходимо «прочитать» выражения узла изнутри, поэтому сначала оценивается самый внутренний путь hasOverlap, а затем результаты, которые проходят через фильтр. Если нет результирующих узлов или у них нет rdf: типа, тогда sh: объект не найден и, следовательно, нет тройного вывода.
Кстати, sh: targetClass не нужен, и я думаю, что все это также можно выразить, используя (более новое) ключевое слово sh: values как
ex:OverlapRelations
a rdfs:Class, sh:NodeShape ;
rdfs:label "whether overlap between features is enough to generate relation" ;
sh:property [
sh:path maps:mapstoclass ;
sh:values [ # 1.
sh:path rdf:type ;
sh:nodes [ # 2.
sh:filterShape [
sh:nodeKind sh:BlankNode ;
sh:node ex:mainAreaShape, ex:secAreaShape ;
] ;
sh:nodes [ # 1.
sh:path maps:hasOverlap ;
]
]
]
] .
Опять не проверено, поэтому прошу прощения за любые ошибки:)