如何构建一个关于具有单个CONSTRUCT的个体的RDF图?

时间:2016-04-14 15:39:44

标签: sparql jena semantic-web

我在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似乎没有正确解析它。

1 个答案:

答案 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 .
    }
}