如果我运行此查询
SELECT ?a ?b ?c ?g ?maxtrust
WHERE
{
{
SELECT ?a (MAX(?t) AS ?maxtrust)
WHERE{
GRAPH ?g { ?a a gr:productorservicemodel }
GRAPH <uri:trust> { ?g exepo:trust ?t}
}
GROUP BY ?a
}
GRAPH ?g {?a ?b ?c}
GRAPH <uri:trust> { ?g exepo:trust ?maxtrust}
}
我得到了这个回复:
| a | b | c | g | maxtrust |
|-----------|------------------|--------------------------|-----------|----------|
| uri:prodA | rdf:type | gr:ProductOrServiceModel | uri:alice | 1.0 |
| uri:prodA | exe:EarCoupling | Intraaural | uri:alice | 1.0 |
| uri:prodA | exe:WearingStyle | In-ear | uri:alice | 1.0 |
| uri:prodB | rdf:type | gr:ProductOrServiceModel | uri:bob | 0.5 |
| uri:prodB | exe:EarCoupling | Extraauricolare | uri:bob | 0.5 |
因为我只对a
和g
之间的关系感兴趣,所以我猜这个查询会完成这个诀窍:
SELECT ?a ?g
WHERE
{
{
SELECT ?a (MAX(?t) AS ?maxtrust)
WHERE{
GRAPH ?g { ?a a gr:productorservicemodel }
GRAPH <uri:trust> { ?g exepo:trust ?t}
}
GROUP BY ?a
}
GRAPH ?g {?a ?b ?c}
GRAPH <uri:trust> { ?g exepo:trust ?maxtrust}
}
我希望这个结果:
| a | g |
|-----------|-----------|
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodB | uri:bob |
| uri:prodB | uri:bob |
相反,我得到了这个:
| a | g |
|-----------|-----------|
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
发生了什么事?我对SPARQL逻辑的理解是完全错误的吗?
修改:更多信息
数据集是:
alice(GRAPH uri:alice
):
uri:prodA
a gr:ProductOrServiceModel;
exe:EarCoupling "Intraaural"^^xsd:string ;
exe:WearingStyle "In-ear"^^xsd:string .
bob(GRAPH uri:bob
):
uri:prodA
a gr:ProductOrServiceModel;
exe:EarCoupling "Intraauricolare"^^xsd:string .
uri:prodB
exe:WearingStyle "extraauricolare"^^xsd:string .
trust(GRAPH uri:trust
):
uri:alice exe:trust "1.0"^^xsd:float .
uri:bob exe:trust "0.5"^^xsd:float .
我正在使用stardog作为triplestore
答案 0 :(得分:0)
如果您只对?a
和?g
之间的关系感兴趣,那么您的查询可能会简单得多:
select distinct ?a ?g where {
graph ?g { ?a [] [] }
}