環境
やあ!
別の仕様の特定の関係に関連付けられた質問を表示する仕様があります。私の仕様のすべてのオブジェクトには、いわゆるフラグメント言語化 (relation:hasFragmentVerbalisation) があります。
質問を正しく表示するには、言語化を直接使用できる「単純な」Iri がある場合と、特定のタイプ (この場合は部屋または従業員の場合) である場合を区別する必要があります。その場合、そのタイプのすべてのリソースの優先ラベルを返したいです(基本的に、オブジェクトが部屋を表す場合、データベースにあるすべての部屋を返したいです)。
私は現在クエリに取り組んでおり、次のようなステートメント部分を追加しようとしています:
OPTIONAL {
FILTER(isIRI(?object)).
?object relation:hasFragmentVerbalisation ?objectVerb .
}
OPTIONAL {
FILTER (?objectVerb= "Person"@en || ?objectVerb = "Teacher"@en)
?a employee:prefLabel ?employeename .
BIND( ?employeename as ?final ) .
}
OPTIONAL {
FILTER (?objectVerb= "room"@en || ?objectVerb = "lecture hall"@en)
?b room:prefLabel ?roomnumber .
BIND( ?roomnumber as ?final) .
FILTER (regex(?roomnumber, "20" ))
}
#OPTIONAL {
# FILTER (!BOUND(?final))
# BIND( IF ( isURI(?object), ?objectVerb, ?object) as ?final ) .
#}
ここでしたいこと
?オブジェクトを取得しました。私のクエリの主な結果は ?final オブジェクトです。ここで、考えられる 3 つのケースについて説明します。
- 最初のオプション ステートメント: ここでは、フラグメントの言語化を取得したいだけです。
- 2 番目のオプションのステートメント: 私の IRI が実際に従業員を指している場合、従業員の優先ラベルをすべて ?final として返したいと考えています。基本的に、私はすべての従業員のリストを返しています。
- 3 番目のオプション ステートメント: IRI が部屋を指している場合、?final のすべての部屋番号を返したい。ここでの私の質問にとって、正規表現フィルターは重要ではありません。
- 4 番目の (アウトコメントされた) オプションのステートメント: 2 番目と 3 番目のステートメントが適合しない場合、?final はバインドされません。
問題
一般的に、アウトを除くすべての作品は 1 つの作品にコメントしました。ただし、ここで 2 つの問題があります。
- ?objectVerb を事前定義された文字列と比較する代わりに、2 番目と 3 番目の Optional については、 (疑似コードのみ:) と尋ねます
Do this only if ?object rdf:type iri:for:person:or:room
。しかし、私はそのような声明を出すことができないようです。 - 「outcommented」オプションの呼び出し (最後の呼び出し) はまったく機能せず、その理由について少し混乱しています。私がここで試しているのは次のとおりです。
- 私の ?final 変数がまだ何にもバインドされていない場合、?object が IRI であるかどうかを確認し、そうでない場合は、以前に取得した ?objectVerb-value を ?final の値として設定する必要があります。
ここで誰かが解決策を指摘できますか? 助けてくれてありがとう。
編集:完全なクエリ:
PREFIX relation: <urn:xxx:beziehungen#>
PREFIX yyy: <urn:xxx#>
PREFIX employee: <urn:xxx:fb5:employee#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX room: <urn:yyy:assets:location:room#>
PREFIX label: <urn:xxx:assets:labels#>
PREFIX wording: <urn:xxx:assets:wording#>
SELECT DISTINCT ?first ?second ?third ?fourth ?fourt4 ?fifth ?resulttype
WHERE {
?wording rdf:first ?first1 .
?wording rdf:rest/rdf:first ?second2 .
?wording rdf:rest/rdf:rest/rdf:first ?third3 .
?wording rdf:rest/rdf:rest/rdf:rest/rdf:first ?fourt4 .
?wording rdf:rest/rdf:rest/rdf:rest/rdf:rest/rdf:first ?fifth5 .
relation:hasBureau rdfs:range ?resulttype .
{
SELECT distinct ?wording (COUNT(?wording) AS ?sum)
WHERE {
relation:hasBureau relation:bigWord ?wording .
?wording rdf:rest*/rdf:first ?element .
}
GROUP BY ?wording
HAVING (?sum = 5)
}
OPTIONAL {
FILTER(isIRI(?first1)).
?first1 relation:fragmentWord ?firstVerb.
}
BIND( IF ( isURI(?first1), ?firstVerb , ?first1) as ?first ) .
FILTER(BOUND(?first)).
OPTIONAL {
FILTER(isIRI(?second2)).
?second2 relation:fragmentWord ?secondVerb.
}
OPTIONAL {
FILTER(isIRI(?third3)).
?third3 relation:fragmentWord ?thirdVerb.
}
BIND( IF ( isURI(?third3), ?thirdVerb , ?third3) as ?third ) .
FILTER(BOUND(?third)).
OPTIONAL {
FILTER(isIRI(?fourt4)).
?fourt4 relation:fragmentWord ?fourthVerb .
}
OPTIONAL {
FILTER(isIRI(?fifth5)).
?fifth5 relation:fragmentWord ?fifthVerb.
}
BIND( IF ( isURI(?fifth5), ?fifthVerb, ?fifth5) as ?fifth ) .
FILTER(BOUND(?fifth)).
OPTIONAL {
FILTER (?fourthVerb = "Person"@de || ?fourthVerb = "Dozent"@de || ?fourthVerb = "Lehrender"@de || ?fourthVerb = "Angestellter"@de)
?a employee:prefLabel ?employeename .
BIND( ?employeename as ?fourth ) .
}
OPTIONAL {
FILTER (?fourthVerb = "Hörsaal"@de || ?fourthVerb = "Zimmer"@de || ?fourthVerb = "Seminarraum"@de)
?b room:prefLabel ?roomnumber .
BIND( ?roomnumber as ?fourth ) .
}
FILTER(BOUND(?fourth)).
#OPTIONAL {
# FILTER (!BOUND(?fourth))
# BIND( IF ( isURI(?fourt4), ?fourthVerb, ?fourt4) as ?fourth ) .
#}
OPTIONAL {
FILTER (?secondVerb = "Büro"@de)
BIND( "Büro"@de as ?second ) .
}
OPTIONAL {
FILTER (?secondVerb = "Buero"@de)
BIND( "Buero"@de as ?second ) .
}
OPTIONAL {
FILTER (?secondVerb = "Person"@de || ?secondVerb = "Dozent"@de || ?secondVerb = "Lehrender"@de || ?secondVerb = "Angestellter"@de)
?a employee:prefLabel ?employeename .
BIND( ?employeename as ?second ) .
}
#OPTIONAL {
# FILTER (!BOUND(?second))
# BIND( IF ( isURI(?second2), ?secondVerb, ?second2) as ?second ) .
#}
}
そして、それが機能するためにそれを実行するための非常に短縮されたデータセット:
PREFIX relation: <urn:xxx:beziehungen#>
PREFIX yyy: <urn:xxx#>
PREFIX employee: <urn:xxx:fb5:employee#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX room: <urn:yyy:assets:location:room#>
PREFIX label: <urn:xxx:assets:labels#>
PREFIX wording: <urn:xxx:assets:wording#>
<urn:xxx:fb5:employee#>
rdfs:subClassOf wording:fragment ;
relation:fragmentWord "Person"@de , "Dozent"@de, "Lehrender"@de, "Angestellter"@de .
<urn:yyy:assets:location:room#>
rdfs:subClassOf wording:fragment ;
relation:fragmentWord "Raum"@de , "Zimmer"@de, "Seminarraum"@de, "Hörsaal"@de .
relation:hasBureau
rdf:type rdf:Property ;
owl:minCardinality "1" ;
rdfs:domain employee:name ;
rdfs:range room:number ;
rdfs:label "hat ein Büro"@de, "has a bureau"@en ;
relation:fragmentWord "Büro"@de , "Buero"@de ;
relation:bigWord ("In welchem" relation:hasBureau "ist" <urn:xxx:fb5:employee#> "?") ;
relation:bigWord ("Finde ich" <urn:xxx:fb5:employee#> "in" <urn:yyy:assets:location:room#> "?") .
employee:PersonOne employee:prefLabel "Employee One".
employee:PersonOne relation:hasBureau room:23129 .
room:23129 room:prefLabel "23-129".
employee:PersonTwo employee:prefLabel "Employee Two".
employee:PersonTwo relation:hasBureau room:23232 .
room:23232 room:prefLabel "23-232".