[英]Dynamic predicates in SPARQL CONSTRUCT
我试图在 CONSTRUCT 中只获得一个关系。
请让我介绍一下问题.... 有一个 Actor (actorURI) 与另一个 Actor (actor2URI) 有关系。 只有一种关系可能。 使用 BIND(IF 命令,我试图为特定关系获取正确的 URI,如果没有关系,则使用字符串 'blanko'。
基于数据中的变量(?RelatieSoort),我想区分 5 种类型的关系(ChronologischeOpvolger、ChronologischeVoorganger 等)。
我大概是在问一个愚蠢的问题。 但我不知道该怎么办......我希望有人能帮助我。 提前致谢!
CONSTRUCT {
?actorURI a rico:Agent;
act:heeftRelatie ?relatieURI;
act:heeftRelatieChronologischeOpvolger ?chronologischeOpvolgerAgentURI;
act:heeftRelatieChronologischeVoorganger ?chronologischeVoorgangerAgentURI;
act:heeftRelatieHierarchischBovenliggend ?hierarchischBovenliggendAgentURI;
act:heeftRelatieHierarchischOnderliggend ?hierarchischOnderliggendAgentURI;
act:heeftRelatieAssociatief ?associatiefAgentURI.
}
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 }.
# ActorURI
BIND(IRI(spif:buildString("https://test.nl/id/actordb/actor/{?1}", ENCODE_FOR_URI(?ActorUUID))) AS ?actorURI)
# Actor2URI
BIND(IRI(spif:buildString("https://test.nl/id/actordb/actor/{?1}", ENCODE_FOR_URI(?Actor2UUID))) AS ?actor2URI)
BIND(IF(?RelatieSoort = "Chronologische opvolger", ?actor2URI, "blanko") as ?chronologischeOpvolgerAgentURI)
BIND(IF(?RelatieSoort = "Chronologische voorganger", ?actor2URI, "blanko") as ?chronologischeVoorgangerAgentURI)
BIND(IF(?RelatieSoort = "Hiërarchisch bovenliggend", ?actor2URI, "blanko") as ?hierarchischBovenliggendAgentURI)
BIND(IF(?RelatieSoort = "Hiërarchisch onderliggend", ?actor2URI, "blanko") as ?hierarchischOnderliggendAgentURI)
BIND(IF(?RelatieSoort = "Associatief", ?actor2URI, "blanko") as ?associatiefAgentURI)
}
RESULT https://test/id/actor/actor1 act:heeftRelatieChronologischeOpvolger https://test/id/actor/actor2 ?actorURI act:heeftRelatieChronologischeVoorganger "blanko" ?actorURI act:heeftRelatieHierarchischBovenliggend "blanko" ?actorURI act:heeftRelatieHierarchischOnderliggend "blanko" ?actorURI act:heeftRelatieAssociatief "blanko"
在上面的结果中,您可以看到正在发生的事情.... 显示了实际的关系 (act:heeftRelatieChronologischeOpvolger) 并将两个参与者相互联系起来。 但其他关系不存在,但谓词显示在 CONSTRUCT 中。 我的愿望是不显示 CONSTRUCT 中的其他关系。
问题是查询正在为CONSTRUCT
中所有定义的三元组返回一些值,无论是您的字符串还是空白字符串。 如果参与者之间的关系不存在,则 where 子句不应返回任何内容。 在这种情况下bind
可以返回一个空白节点,然后过滤如果是这种情况,让我们看看:
BIND(IF(?RelatieSoort = "Chronologische opvolger", ?actor2URI, bnode()) as ?chronologischeOpvolgerAgentURI)
FILTER(!isBlank(?chronologischeOpvolgerAgentURI))
如果您向我们提供数据集,我们可以为您提供更好的帮助。
go 的方法是在construct
中使用 var 作为属性,并根据来自?RelatieSoort
的值匹配设置其值,例如以下几行:
CONSTRUCT {
?actorURI a rico:Agent;
act:heeftRelatie ?relatieURI;
?prop ?actor2URI.
} where {
...
BIND(IF(?RelatieSoort = "Chronologische opvolger", act:heeftRelatieChronologischeOpvolger,
IF(?RelatieSoort = "Chronologische voorganger", act:heeftRelatieChronologischeVoorganger,
IF(?RelatieSoort = "Hiërarchisch bovenliggend", act:heeftRelatieHierarchischBovenliggend,
IF(?RelatieSoort = "Hiërarchisch onderliggend", act:heeftRelatieHierarchischOnderliggend,
IF(?RelatieSoort = "Associatief", act:heeftRelatieAssociatief, ?unbound_var))))) as ?prop)
}
高温高压
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.