2015-09-09 21 views
1

我试图GROUP_CONCAT a UNION两组三元组。 这是不允许的?SPARQL组concar union

PREFIX bo: <https://webfiles.uci.edu/jenniyk2/businessontology#> 
SELECT (GROUP_CONCAT(DISTINCT ?m2;SEPARATOR = ", ") AS ?comp) 
WHERE 
{ 
{{SELECT ?m2 ?c ?p 
WHERE { ?c rdfs:label ?m. ?c2 rdfs:label ?m2. ?so bo:owner ?p. 
?so bo:sharesIn ?c. ?so2 bo:owner ?p. ?so2 bo:sharesIn ?c2. } 
} 
UNION 
{SELECT ?m2 ?c ?p 
WHERE { ?c rdfs:label ?m. ?c2 rdfs:label ?m2. ?dir bo:isPartOf ?c. 
?dir bo:isDirectedBy ?p. ?dir2 bo:isPartOf ?c2. ?dir2 bo:isDirectedBy ?p.} 
}} 
GROUP BY ?c 
HAVING (COUNT(?m2) >1)} 

它说最后一行有错误。

Found group. Was expecting one of : BIND, BLANK_NODE_LABEL, DECIMAL, DOUBLE, FALSE, FILTER, GEO, GRAPH, INTEGER, MINUS, NIL-SYMBOL, OPTIONAL, Q_IRI_REF, QNAME, QNAME_NS, SERVICE, STRING_LITERAL1, STRING_LITERAL2, STRING_LITERAL_LONG1, STRING_LITERAL_LONG2, TEXTINDEX, TRUE, UNION, VALUES, VARNAME or punctuation '(', '+', '-', '.', '[', '[]', '{', '}'.

+1

看起来这里有更多的查询比必要的更多。我查询不会自动生成或类似的东西,我想你可以使它更简单一些。这不完全是JeenB指出的印刷问题,但它可能使得首先抓住它更容易。 –

回答

6

GROUP BYHAVING条款应WHERE条款,而不是在它里面,因为他们现在是。为了使您的查询语法正确,从最后一行除去收盘}并添加就行了你上面的GROUP BY

PREFIX bo: <https://webfiles.uci.edu/jenniyk2/businessontology#> 
SELECT (GROUP_CONCAT(DISTINCT ?m2;SEPARATOR = ", ") AS ?comp) 
WHERE 
{ 
{{SELECT ?m2 ?c ?p 
WHERE { ?c rdfs:label ?m. ?c2 rdfs:label ?m2. ?so bo:owner ?p. 
?so bo:sharesIn ?c. ?so2 bo:owner ?p. ?so2 bo:sharesIn ?c2. } 
} 
UNION 
{SELECT ?m2 ?c ?p 
WHERE { ?c rdfs:label ?m. ?c2 rdfs:label ?m2. ?dir bo:isPartOf ?c. 
?dir bo:isDirectedBy ?p. ?dir2 bo:isPartOf ?c2. ?dir2 bo:isDirectedBy ?p.} 
}}} 
GROUP BY ?c 
HAVING (COUNT(?m2) >1) 

约书亚还表示,查询可以写成一个简单了很多,但是这应该解决你眼前的问题。

6

Jeen Broekstra的答案确定了导致语法错误的印刷问题,但我认为值得一提的是,这个查询可以简化一点,因为从一开始的简单代码可以更容易地发现拼写错误和语法错误。如果我正确地读它,它看起来像查询的身体简化为这样:

?c rdfs:label ?m . 
    ?c2 rdfs:label ?m2 . 
    { ?so bo:owner ?p ; 
     bo:sharesIn ?c . 
    ?so2 bo:owner ?p ; 
     bo:sharesIn ?c2 . } 
    union 
    { ?dir bo:isPartOf ?c ; 
      bo:isDirectedBy ?p . 
    ?dir2 bo:isPartOf ?c2 ; 
      bo:isDirectedBy ?p } 

你正在寻找一个ç多数民众赞成由两个特定类型的路径中的一个连接到? ?c2,并且您想通过?c进行分组,并连接不同标签?c2。我看到两种方式可以进一步简化。首先是使用属性路径,因为您实际上并未使用这些变量中的许多值。与属性路径中,主体可以成为:

?c rdfs:label ?m . 
    ?c2 rdfs:label ?m2 . 
    { ?c ^bo:sharesIn/bo:owner/^bo:owner/bo:sharesIn ?c2 } 
    union 
    { ?c ^bo:isPartOf/bo:isDirectedBy/^bo:isDirectedBy/bo:isPartOf ?c2 } 

作为另一替代方案,因为在每个联合替代的图案的结构是类似的,你可以抽象一点与

?c rdfs:label ?m . 
    ?c2 rdfs:label ?m2 . 
    values (?sharesIn_isPartOf ?owner_isDirectedBy) { 
    (bo:sharesIn bo:owner) 
    (bo:isPartOf bo:isDirectedBy) 
    } 
    ?x ?owner_isDirectedBy ?y ; 
     ?sharesIn_isPartOf ?c . 
    ?x2 ?owner_isDirectedBy ?y ; 
     ?sharesIn_isPartOf ?c2 .