我有一个RDF文件,我需要在一个单行从中获取一些信息。
现在,我使用AllegroGraph与Prolog的查询ENGIN:
(select (?result)
(q ?a !rdfs:label ?alabel)
(q ?b !rdfs:label ?blabel)
(lisp ?result (string+ ?alabel " AND " ?blabel)))
获得在一行的结果:
"{a1} AND {b1}"
"{a1} AND {b2}"
"{a2} AND {b1}"
"{a2} AND {b2}"
现在,我需要组中的所有行?导致与字符串“或”单行。 所以我得到:
"{a1} AND {b1} OR {a1} AND {b2} OR {a2} AND {b1} OR {a2} AND {b2}"
是否有任何序言函数来做到这一点?
你只得到了事实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}
用bind
和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 .
}
还有一些其他的例子group_concat
,可能对你有用,以及漂浮在计算器上:
- 从SPARQL查询聚合结果
- RDF名单科目与他们在一个单一的线对象 (这实际上是你问另外一个问题,那我回答,并在这个问题的答案,我也指出了前面的问题)
- 获得门生矩阵 (这样做一些很花哨的字符串操作)
- SPARQL查询来获取一个节点的所有父