我在SPARQL中有一个构造查询,可用于检索有关合同的详细信息:
CONSTRUCT {
?contract dcterm:identifier ?id .
?contract rdfs:label ?label .
?contract pc:bidder ?bidder .
}
WHERE {
OPTIONAL {
?contract dcterm:identifier ?id .
}
OPTIONAL {
?contract rdfs:label ?label .
}
OPTIONAL {
?contract pc:tender ?tender .
?tender pc:bidder ?bidder .
}
}
我有一份合约清单,例如pc:c1,pc:c2,我想在一个查询(或一个单独的HTTP调用)中检索两者的详细信息。
第一个想法是用每个uri替换?contract变量,避免其他变量之间的冲突:
CONSTRUCT {
pc:c1 dcterm:identifier ?id1 .
pc:c1 rdfs:label ?label1 .
pc:c1 pc:bidder ?bidder1 .
pc:c2 dcterm:identifier ?id2 .
pc:c2 rdfs:label ?label2 .
pc:c2 pc:bidder ?bidder2 .
}
WHERE {
OPTIONAL {
pc:c1 dcterm:identifier ?id1 .
}
OPTIONAL {
pc:c1 rdfs:label ?label1 .
}
OPTIONAL {
?pc:c1 pc:tender ?tender1 .
?tender1 pc:bidder ?bidder1 .
}
OPTIONAL {
pc:c2 dcterm:identifier ?id2 .
}
OPTIONAL {
pc:c2 rdfs:label ?label2 .
}
OPTIONAL {
?pc:c2 pc:tender ?tender2 .
?tender2 pc:bidder ?bidder2 .
}
}
问题是,对于许多uris,查询可能会变得非常大。
是否有更紧凑的方式来编写它?
我尝试使用IN运算符(https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#OperatorMapping - 17.4.1.9)但是Virtuoso似乎没有解析查询。 另外VALUES关键字(https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#inline-data)似乎是一个很好的解决方案,但Jena似乎没有正确解析它。
答案 0 :(得分:4)
只需使用值指定所需的?合约的值即可。 (Jena确实支持值,所以也许你的测试中有错字?)这就是它的样子:
var tween = this.game.add.tween(sprite)
.to({ y: originalY) }, 400, Phaser.Easing.Bounce.InOut));
tween.start();
对于单个属性匹配,您还可以使用值来缩短属性。您还可以使用属性路径缩短投标人的部分:
CONSTRUCT {
?contract dcterm:identifier ?id .
?contract rdfs:label ?label .
?contract pc:bidder ?bidder .
}
WHERE {
VALUES ?contract { pc:c1 pc:c2 } #-- this is the new line
OPTIONAL {
?contract dcterm:identifier ?id .
}
OPTIONAL {
?contract rdfs:label ?label .
}
OPTIONAL {
?contract pc:tender ?tender .
?tender pc:bidder ?bidder .
}
}