我尝试在ARC2中使用SPARQL group_concat
聚合,但似乎不支持它。有可用的解决方法或替代方案吗?鉴于数据:
@prefix recipe: <url> .
@prefix myrecipe: <url> .
@prefix myfood: <url> .
myrecipe:Pizza a recipe:Recipe ;
recipe:ingredients [ a recipe:IngredientList ;
rdf:_1 [ a recipe:Ingredient ;
recipe:food myfood:Chicken ;
recipe:quantity "225g" ;
] ;
rdf:_2 [ a recipe:Ingredient ;
recipe:food myfood:Bacon ;
recipe:quantity "125g" ;
] ;
]
我希望我的查询返回一个包含多个成分的结果。我当前的查询返回每个成分的新结果:
SELECT ?recipe ?food
WHERE {
?recipe a recipe:Recipe ;
recipe:ingredients ?ingredientList .
?ingredientList ?p ?s .
?s a recipe:Ingredient ;
recipe:food ?food
}
当我尝试使用group_concat
聚合时,查询会返回0
,而我在代码库中找不到对group_concat
的任何引用。
使用group concat的示例查询:
SELECT ?recipe (GROUP_CONCAT(?food) as ?ing)
WHERE {
?recipe a recipe:Recipe ;
recipe:ingredients ?ingredientList .
?ingredientList ?p ?s .
?s a recipe:Ingredient ;
recipe:food ?food
}
然后将其作为SPARQL字符串传递给arc2。并且返回的结果为0.这通常表示查询出错,但除了使用group_concat之外我看不到其他
答案 0 :(得分:1)
问题(至少在我写作时)不包括使用group_concat
或显示结果的查询,因此不清楚这里的问题是否是使用{构建查询{1}},或者让它与ARC2一起使用。但是,ARC2的最后发布日期是在2011年,而SPARQL 1.1是在2013年发布的,因此如果ARC2不支持SPARQL 1.1,那就不足为奇了。特别是,可以从两年前编辑的version of ARC2上次编辑,group_concat
类具有返回ARC2
的{{1}}函数。 SPARQL 1.1(定义{{1}})直到2013年3月21日才发布,所以如果ARC2仅支持第一版SPARQL,我不会感到惊讶。此外,ARC2自述文件中的历史记录部分说明了
ARC于2004年开始作为轻量级RDF系统进行解析和分析 序列化RDF / XML文件。它后来演变成更完整的 具有存储和查询功能的框架。到2011年,ARC2有了 成为最安装的RDF库之一。尽管如此,活跃 由于缺乏资金而且代码开发不得不停止 无法有效地实现不断增长的RDF堆栈 规格。
由于定义了getVersion
前缀,因此您的数据不是完全可用的格式。这是我们可以使用的数据:
2011-12-01
group_concat
此类查询将说明如何使用rdf:
@prefix myrecipe: <https://stackoverflow.com/q/20827591/1281433/myrecipe/> .
@prefix recipe: <https://stackoverflow.com/q/20827591/1281433/recipe/> .
@prefix myfood: <https://stackoverflow.com/q/20827591/1281433/myfood/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
myrecipe:Pizza a recipe:Recipe ;
recipe:ingredients [ a recipe:IngredientList ;
rdf:_1 [ a recipe:Ingredient ;
recipe:food myfood:Chicken ;
recipe:quantity "225g"
] ;
rdf:_2 [ a recipe:Ingredient ;
recipe:food myfood:Bacon ;
recipe:quantity "125g"
]
] .
group_concat
group_concat
prefix recipe: <https://stackoverflow.com/q/20827591/1281433/recipe/>
prefix myrecipe: <https://stackoverflow.com/q/20827591/1281433/myrecipe/>
prefix myfood: <https://stackoverflow.com/q/20827591/1281433/myfood/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?recipe (group_concat(?food) as ?ingredients) where {
?recipe a recipe:Recipe ;
recipe:ingredients ?ingredientList .
?ingredientList ?p ?s .
?s a recipe:Ingredient ;
recipe:food ?food
}
group by ?recipe
。包括使用------------------------------------------------------------------------------------------------------------------------------------------
| recipe | ingredients |
==========================================================================================================================================
| myrecipe:Pizza | "https://stackoverflow.com/q/20827591/1281433/myfood/Bacon https://stackoverflow.com/q/20827591/1281433/myfood/Chicken" |
------------------------------------------------------------------------------------------------------------------------------------------
在内的其他一些问题和答案可能会引起关注:
我要指出查询中的三重模式group_concat
用于获取成分列表的元素。但是,这可能会获得比您实际查找的信息更多的信息。如果您正在使用可以进行一些推理的查询引擎,那么您可能有兴趣使用group_concat
,这是所有group_concat
属性的超级属性:
5.1.6 rdfs:member
?ingredientList ?p ?s
是rdfs:member
的一个实例,它是一个超级属性 所有容器成员属性,即每个容器成员资格 酒店与酒店有rdf:_nnn
的关系rdfs:member
。
原则上,这意味着您可以将查询编写为:
rdf:Property
现在,您需要一个查询引擎,它也可以进行RDF(S)推理。但是,如果您使用实际的RDF列表,则可以直接编写查询。特别是,如果您像这样代表您的数据:
rdfs:subPropertyOf
和这样的查询:
rdfs:member
获得相同的结果(在这种情况下),但您可以保证只获得实际上是成分列表元素的结果,并且您不需要使用任何RDF(S)推理。作为一个观点,我认为它也使数据和查询更加清晰。