我需要帮助理解这个 sparql 查询的作用(要求):
SELECT ?subject ?object
WHERE { ?subject onto:personName ?object . ?w ?q ?s}
Run Code Online (Sandbox Code Playgroud)
这是来自于人的本体论。第一部分容易理解;一些未知的主题必须有一个具有未知值的 personName,但为什么第二部分相关?
这是我需要帮助理解的内容:当有两个模式(“.”之前和之后)时,这是否意味着节点必须同时匹配第一个和第二个模式?如果是这样,那么在这种情况下,第二个模式会说:“一些未知的主体必须有一些未知的谓词和一些未知的对象”,这将返回 RDF 图中的所有三元组......所以在这种情况下,第二个模式将匹配所有三元组,但结果将受到第一个模式的限制。
我的问题是,为什么第二个模式那么重要,因为它似乎只相当于第一个模式。但是当我运行它时,我得到了本体中的“所有”三元组,所以我需要准确理解查询的作用。
另外:如果我替换?w
为会发生什么?object
,从而绑定?object
到 boh 模式,所以看起来:?object
必须有一些谓词?q
和一些对象?s
,所以如果我替换?w
为?object
,它会找到模式 1 中的传递对象 ( ?s
) ?object
……换句话说:?subject --> onto:personName --> ?object --> ?q --> ?s
。
这是我需要帮助理解的内容:当有两个模式(“.”之前和之后)时,这是否意味着节点必须同时匹配第一个和第二个模式?
是的。
如果是这样,这种情况下的第二个模式接缝说:“一些未知的主体必须有一些未知的谓词和一些未知的对象”,这将返回 RDF 图中的所有三元组......
正确的。
所以在这种情况下,第二个模式将匹配所有三元组,但结果将受到第一个模式的限制。
实际上,第二个模式的结果根本不受第一个模式的限制——因为这些模式不共享变量。您没有取回数据集中所有三元组的原因很简单,因为在您的SELECT
子句中,您只指定了第一个模式中的变量。如果你说SELECT *
或者SELECT ?subject ?object ?w ?q ?s
相反,你会得到一切。
我的问题是,为什么第二个模式那么重要,因为它似乎只相当于第一个模式。
这不是等价的,因为第二个模式匹配所有可能的三元组,而第一个模式只匹配那些onto:personName
作为谓词的三元组。
虽然为?w
、?q
或找到的值都没有?s
出现在您的查询结果中,但包含此模式确实会对您的结果产生影响。通过指定两个模式,您可以有效地表达两个模式之间的连接。由于这两种模式不共享变量,因此可以说没有“连接条件”。这样做的结果是,您的查询结果将是与第一个模式匹配的所有三元组和与第二个模式匹配的所有三元组的 Carthesian 乘积。
因此,您将在查询结果中看到的是,您将获得许多重复的?subject
and行?object
:每对将重复 N 次,其中 N 是与第二个模式匹配的三元组的数量。
所以总而言之,除非你有一个非常奇特的用例,否则第二种模式比无用更糟糕,因为它不仅不会在结果中产生任何有用的数据,而且确保结果包含大量重复(并且可能还会导致您的查询执行时间远高于真正需要的时间)。
另外:如果我用 ?object 替换 ?w 会发生什么,从而将 ?object 绑定到 boh 模式,所以看起来:?object 必须有一些谓词 ?q 和一些对象 ?s,所以如果我替换 ?w使用 ?object,它将在模式 1 中找到 ?object 的传递对象 (?s)... 换句话说:?subject --> on:personName --> ?object --> ?q --> ?s .
的确。如果你这样做了,你就会有一个共享变量,因此两个模式之间会有一个连接条件。对查询结果的影响将是你现在不再收到所有 ?subject ?object
针对其对onto:personName
谓词存在,但只有那些为它是还不错,?object
值出现在数据集中的其他一些地方三合一的主题。