SPARQL CONSTRUCT中仅保留有效关联谓词的技术问题
解决SPARQL CONSTRUCT只保留有效关联类型的问题
你的核心困扰是当前CONSTRUCT语句会强制输出所有五个关联谓词,哪怕对应的对象是无效的"blanko"。要实现只保留实际存在的那一种关联类型,我们需要动态匹配谓词和对象,而不是提前在CONSTRUCT里枚举所有可能的谓词。
修改后的SPARQL查询
CONSTRUCT { ?actorURI a rico:Agent ; act:heeftRelatie ?relatieURI . ?actorURI ?relatiePredicate ?actor2URI . } WHERE { ?row a mydata:Row ; optional { ?row mydata:RelatieUUID ?RelatieUUID } ; optional { ?row mydata:ActorUUID ?ActorUUID } ; optional { ?row mydata:Actor2UUID ?Actor2UUID } ; optional { ?row mydata:RelatieSoort ?RelatieSoort } ; optional { ?row mydata:Toelichting ?Toelichting } ; optional { ?row mydata:Begin ?Begin } ; optional { ?row mydata:Eind ?Eind } . # 生成Actor和Actor2的URI BIND(IRI(spif:buildString("https://test.nl/id/actordb/actor/{?1}", ENCODE_FOR_URI(?ActorUUID))) AS ?actorURI) BIND(IRI(spif:buildString("https://test.nl/id/actordb/actor/{?1}", ENCODE_FOR_URI(?Actor2UUID))) AS ?actor2URI) # 根据RelatieSoort绑定对应的谓词,只有匹配时才生成绑定 OPTIONAL { VALUES (?RelatieSoort ?relatiePredicate) { ("Chronologische opvolger" act:heeftRelatieChronologischeOpvolger) ("Chronologische voorganger" act:heeftRelatieChronologischeVoorganger) ("Hiërarchisch bovenliggend" act:heeftRelatieHierarchischBovenliggend) ("Hiërarchisch onderliggend" act:heeftRelatieHierarchischOnderliggend) ("Associatief" act:heeftRelatieAssociatief) } } # 过滤掉无有效关联的情况,确保只生成存在的关联三元组 FILTER(BOUND(?relatiePredicate)) }
关键修改点说明:
- 动态谓词映射:用
VALUES子句把关联类型和对应的谓词做一一映射,只有当?RelatieSoort匹配某个有效值时,?relatiePredicate才会被绑定。 - 过滤无效条目:
FILTER(BOUND(?relatiePredicate))确保只有存在有效关联类型时,才会生成?actorURI ?relatiePredicate ?actor2URI这个三元组,彻底避免"blanko"的无效输出。 - 移除固定枚举的谓词:把原CONSTRUCT里固定写死的五个关联谓词,替换成动态的
?actorURI ?relatiePredicate ?actor2URI,这样只会输出实际匹配到的那一种关联。
效果验证
修改后,当?RelatieSoort为"Chronologische opvolger"时,只会生成如下有效三元组:
https://test/id/actor/actor1 a rico:Agent https://test/id/actor/actor1 act:heeftRelatieChronologischeOpvolger https://test/id/actor/actor2 # 如果RelatieUUID存在,还会生成对应的act:heeftRelatie三元组
不会再出现任何值为"blanko"的无效关联条目。
内容的提问来源于stack exchange,提问作者Fina83
相关产品推荐
相关产品推荐

