Sparql 我如何用一个单一的结构构建关于某些个体的RDF图?

Sparql 我如何用一个单一的结构构建关于某些个体的RDF图?,sparql,jena,semantic-web,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:

我在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 .
    }
}
问题是,对于许多URI,查询可能会变得相当大

有没有更简洁的方法来写呢

我尝试使用IN运算符(-17.4.1.9),但Virtuoso似乎无法解析查询。
同样,VALUES关键字()似乎是一个很好的解决方案,但Jena似乎没有正确地解析它。

只需使用value来指定所需的?contract的值。(Jena确实支持值,所以您的测试可能有输入错误?)

构造{
?合同条款:标识符?id。
?合同RDF:标签?标签。
?合同pc:投标人?投标人。
}
在哪里{
价值?合同{pc:c1 pc:c2}#——这是新的一行
可选的{
?合同条款:标识符?id。
}
可选的{
?合同RDF:标签?标签。
}
可选的{
?合同pc:投标书?投标书。
?投标pc:投标人?投标人。
}
}
对于单个属性匹配,还可以使用属性的将其缩短。您还可以使用属性路径缩短投标人零件:

CONSTRUCT {
  ?contract ?p ?o .
  ?contract pc:bidder ?bidder .
}
WHERE {
    VALUES ?contract { pc:c1 pc:c2 } 
    VALUES ?p { dcterm:identifier rdfs:label }
    OPTIONAL {
      ?contract ?p ?o
    }
    OPTIONAL {
        ?contract pc:tender/pc:bidder ?bidder .
    }
}

哪个Jena版本不工作?你说得对,错误是在URI内部值之间使用了分隔符!很干净,还有你的第二个提示!谢谢