我可以在AllegroGraph prolog中这样做吗?

时间:2013-09-20 12:39:55

标签: prolog rdf sparql allegrograph

我有一个RDF文件,我需要从一行中提取一些信息。

现在,我正在使用AllegroGraph和Prolog查询引擎:

(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}" 

现在,我需要将结果的所有行分组为一行,并使用字符串“OR”。所以我得到了:

 "{a1} AND {b1} OR {a1} AND {b2} OR {a2} AND {b1} OR {a2} AND {b2}" 

prolog中是否有任何功能可以做到这一点?

1 个答案:

答案 0 :(得分:2)

你左边只有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浮动在StackOverflow上的例子也可能对你有用: