여러 값을 얻기 위해 인쇄되는 rdf:유형
문제
내가 만든 클래스는 자산의 하위 클래스 http://schema.org/CreativeWork 자산는 2 개의 서브 클래스고 말 문서 및 출판물
이제 나는 인스턴스의 문서 또는 출판 클래스입니다.자산는 추상 클래스입니다.
면 인쇄 메타데이터에 대한 기사 또는 책도 인쇄하려는 형식의 자산입니다.이 경우에는 것 문서 또는 게시합니다.
나는 다음 쿼리를 실행합니다
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
}
지금 대신 인쇄 형식으로 문서 또는 출판물에 대한 모든 자산이 나에서 여러 값 rdf:유형입니다.예
id title Type
1 this is a article CreativeWork
1 this is a article Asset
1 this is a article Article
2 this is a publication CreativeWork
2 this is a publication Asset
2 this is a publication Article
고 싶어 어떻게든 인쇄 문서 또는 출판물에서 유형 열
내가 어떻게 이것을 달성할 수?
해결책
당신을 이해할 때, 당신의 등급 계층 구조는 다음과 같습니다.
CreativeWork
Asset
Article
Publication
.
몇 가지 옵션이 있습니다.
가장 단순한 것은 값 :
로이 값을 지정할 수있는이를 지정할 수있는 값을 고려하고 싶습니다.SELECT ?id ?title ?type
WHERE
{
values ?type { Article Publication }
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
}
.
이것은 당신이 할 수있는 가장 구체적인 것입니다, 당신은 유형이 기사 또는 출판만을 보장합니다.
krantivework and aset
물론 나중에 다른 하위 클래스를 정의 할 수 있으며 해당 할 때마다 값 블록에 더 많은 유형을 추가해야 할 수도 있습니다. CreativeWork 및 Asset을 필터링하는 것을 간단히 필터링하는 것이 좋습니다.
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
filter ( ?type != Asset && ?type != CreativeWork )
}
.
다음을 수행 할 수도 있습니다.
filter ( ?type NOT IN ( Asset, CreativeWork ) )
.
최대 특정 클래스 만 얻는
이것은 클래스가 어떤 수업을 할 수 있는지, 나중에 기사 또는 출판물의 하위 클래스를 추가하는 경우, 저널 article ⊑ 기사의 서브 클래스를 추가하면 결과가 발생할 것입니다. 기사와 저널을 모두 포함하고, 그렇게 원하지 않을 수도 있습니다. 당신이 원하는 것은 대신에, 개인을위한 "가장 구체적인"클래스입니다. 즉, 개인의 클래스 C는 개인이 다른 유형 D ∈ C를 형성하지 않도록 원하는 것입니다 ( 다른 은 중요합니다. .) 일반적인 아이디어는 SpaRQL 쿼리를 사용하여 온톨로지에서 적어도 공통된 하위 자를 얻는 방법은 무엇입니까? , 다른 질문과 함께 그러나 여기에서 중요한 부분을 쉽게 재현 할 수 있습니다 :
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
filter not exists { # Don't take ?type as a result if
?asset rdf:type ?subtype . # ?asset has some other ?subtype
?subtype rdfs:subClassOf* ?type . # that is a subclass of ?type
filter ( ?subtype != ?type ) # (other than ?type itself).
}
}
.
이렇게하면 개인이있는 계급에서 "가장 깊은"클래스를 얻을 수 있습니다. 개인이 다른 사람의 하위 클래스 인 클래스의 구성원이라면 여전히 여러 결과를 반환 할 수 있습니다. 물론,이 경우는 아직 모든 결과에 관심이있을 것입니다.
다른 팁
당신은 당신이 출력하기 때문에,귀하의 자산이 모든 자산 및 CreativeWorks,그리고 그들은 또한 수사 또는 출판물.는 경우에만 인쇄하고 싶은 서브 클래스의 자산,그 다음을 사용할 수 있습니다 쿼리를 제한하는 값의 ?type
(당신과 같은 추가로 라인):
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
?type rdfs:subClassOf Asset .
}
가 rdfs
네임스페이스의 접두사 http://www.w3.org/2000/01/rdf-schema#.
그것이 의미하는 ?type
해야 하위 클래스의 자산이다.
첫 번째 제한(?asset rdf:type Asset
)지 않은 실제적으로 필요하지만,저는 그것을 떠나 명확성을 가지고 있기 때문에 당신이 그것에서 당신의 초기 쿼리가 있습니다.할 수 있습이 안전하게 건너뛰기습니다.