2016-08-01 134 views
0

我在想这些这两个查询是否产生相同的输出。 让我们想象一下,我有我收集数据的两个RDF命名图,并且前缀是店铺: 我想写一个SPARQL查询,其中找出哪些客户更喜欢哪一顿,输出应该是人类可读的SPARQL语法差异

一)

PREFIX shop: <"http://example.org/shop"> 
SELECT ?customerName ?mealName 
FROM <Customers.rdf> 
FROM <Meals.rdf> 
WHERE 
{ 
?customer shop:prefersMeal ?meal . 
?meal shop:mealName ?mealName . 
?customer shop:customerName ?customerName 
} 

b)

PREFIX shop: <"http://example.org/shop"> 
SELECT ?customerName ?mealName 
FROM <Customers.rdf> 
FROM <Meals.rdf> 
WHERE 
{ 
?x shop:prefersMeal ?meal . 
?y shop:mealName ?mealName . 
?z shop:customerName ?customerName 
} 

我试图找出差异,但是当你没有任何地方练习看起来比较复杂。

+0

你是什么意思,你没有任何地方练习?下载并安装简单的三重存储并尝试一些SPARQL查询非常简单。例如,请参阅[RDF4J服务器的安装说明](http://rdf4j.org/doc/rdf4j-server-workbench-and-console/installing-rdf4j-server-and-rdf4j-workbench/)。 –

+2

当您将两个查询都视为图时,差异就变得非常明显,即为每个三元模式绘制一个边,其中节点是主题和对象,边标签是谓词。 – AKSW

回答

4

这两个查询不相同。

在第一个查询中,您将在第二个和第三个三重模式中重复使用来自您的第一个三重模式的变量?meal?customer。在这个查询中,你的意思是:“给我一个喜欢吃饭的顾客,同一餐必须有一个名字,同一个顾客必须有一个名字。”

在第二个查询中,您在第二个和第三个子句中使用新变量?y?z。这个查询说的是:“给我一个喜欢吃饭的顾客,给我一些餐的名字,并给我一些顾客的名字”。您不强制检索的名称针对同一客户/餐饮,因此您将得到随机的客户/膳食组合,而不是每个客户的实际首选膳食。

+0

你是说如果我用?x来更改?z,它会强制使用prefersMeal的CustumerName(比如绑定客户名称和优先餐),并且两个查询的结果都是相同的(它们会产生相同的输出?)。我正在使用Windows并为sparql寻找windows。 – Shkolla

+0

您还需要用'?meal'(或'?meal'替换'?y',如果您愿意的话)替换'?y'。而RDF4J在Windows上运行良好。但如果你想要一些不同的东西做一个快速的谷歌搜索,有很多选项。 –