我可以在AllegroGraphprolog中做到这一点吗?



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

现在,我正在使用带有Prolog查询的AllegroGraph

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

现在,我需要将 ?result 的所有行分组到一行中,字符串为"OR"。 所以我得到:

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

prolog中有什么功能可以做到这一点吗?

事实上,

你只有左边的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" .

您可以按类(:ClassA:ClassB)选择?a?b,然后提取它们的标签,模式如下:

?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .

然后你可以得到一个bind和一个concat {alabel} AND {blabel}

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上浮动的例子可能对你有用:

  • 聚合来自 SPARQL 查询的结果
  • RDF在一行中列出主题及其对象(这实际上是您提出的另一个问题,我回答了,在该答案中,我也指出了上一个问题)
  • 在 protégé 中获取矩阵(这做了一些非常花哨的字符串操作)
  • SPARQL 查询以获取节点的所有父节点

相关内容

  • 没有找到相关文章

最新更新