事实上,你只有a*
在左边和b*
右边意味着你有一些其他的选择条件,而不仅仅是一个标签。给定这样的数据:
@prefix : <http://example.org/>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
:a1 a :ClassA ; rdfs:label "a1" .
:a2 a :ClassA ; rdfs:label "a2" .
:b1 a :ClassB ; rdfs:label "b1" .
:b2 a :ClassB ; rdfs:label "b2" .
您可以通过它们的类(和)选择?a
和,然后也可以提取它们的标签,其模式如下:?b
:ClassA
:ClassB
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
然后你可以得到{alabel} AND {blabel}
abind
和 a concat
:
bind( concat( "{", ?alabel, "} AND {", ?blabel, "}" ) as ?AandB )
使用这些,像这样的查询
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?AandB {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
bind( concat( "{", ?alabel, "} AND {", ?blabel, "}" ) as ?AandB )
}
将为您提供您已经可以获得的结果:
-------------------
| AandB |
===================
| "{a2} AND {b2}" |
| "{a2} AND {b1}" |
| "{a1} AND {b2}" |
| "{a1} AND {b1}" |
-------------------
现在的诀窍是使用group_concat
和一个隐式组将所有这些组合成一个字符串,分隔符为" OR "
:
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ( group_concat( ?AandB ; separator=" OR ") as ?string ) where {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
bind( concat( "{", ?alabel, "} AND {", ?blabel, "}" ) as ?AandB )
}
得到结果:
----------------------------------------------------------------------
| string |
======================================================================
| "{a2} AND {b2} OR {a2} AND {b1} OR {a1} AND {b2} OR {a1} AND {b1}" |
----------------------------------------------------------------------
如果你愿意,你甚至可以去掉bind
,直接把concat
表达式放到group_concat
. 您可能会发现更容易阅读(少跳动)或更难阅读(大单行),但至少有选择是件好事:
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ( group_concat( concat( "{",?alabel,"} AND {",?blabel,"}" ) ; separator=" OR ") as ?string ) where {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
}
StackOverflow 上还有其他一些group_concat
浮动示例,它们也可能对您有用: