我能做到这一点的AllegroGraph序言?(can I do this in AllegroGr

2019-10-18 15:48发布

我有一个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}" 

是否有任何序言函数来做到这一点?

Answer 1:

你只得到了事实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}bindconcat

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查询来获取一个节点的所有父


文章来源: can I do this in AllegroGraph prolog?