带有ARC2的group_concat

时间:2013-12-29 16:48:34

标签: php rdf sparql semantic-web

我尝试在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之外我看不到其他

1 个答案:

答案 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

的更多信息 来自SPARQL规范的18.5.1.7 GroupConcat中描述了

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 ?srdfs:member的一个实例,它是一个超级属性   所有容器成员属性,即每个容器成员资格   酒店与酒店有rdf:_nnn的关系   rdfs:member

原则上,这意味着您可以将查询编写为:

rdf:Property

现在,您需要一个查询引擎,它也可以进行RDF(S)推理。但是,如果您使用实际的RDF列表,则可以直接编写查询。特别是,如果您像这样代表您的数据:

rdfs:subPropertyOf

和这样的查询:

rdfs:member

获得相同的结果(在这种情况下),但您可以保证只获得实际上是成分列表元素的结果,并且您不需要使用任何RDF(S)推理。作为一个观点,我认为它也使数据和查询更加清晰。