块外的 Sparql 变量未绑定在块内
Sparql variable outside of a block not bound inside a block
在针对 Sesame 内存存储的 Sparql 查询中,我想分离我的查询条件,例如"Patient is male" 来自生成查询结果的其余查询。
让我们考虑这个简单的查询:
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX nci:<http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#>
PREFIX roo: <http://www.cancerdata.org/roo/>
SELECT DISTINCT *
WHERE {
?Patient a nci:C16960 .
?Patient roo:100018 ?gender .
?gender a nci:C20197 .
BIND(bound(?Patient) as ?bound0) .
{
BIND(bound(?Patient) as ?bound1) .
}
UNION {
?Patient a nci:C16960 .
BIND(bound(?Patient) as ?bound2) .
}
}
Bound0 始终为真(正如预期的那样)。 Bound1 始终为 false,而 Bound2 在结果集中根本没有值(有和没有额外的 ?Patient 三元组)。
这是否意味着 ?Patient 变量在第一个块中已知,但未绑定并且在第二个块中根本不存在(即使我再次声明它)?为什么会有不同?
我的目标是先定义复杂的查询条件,然后将结果集缩减为仅匹配所有条件的患者。然后使用已经减少的 ?Patient 来收集输出中请求的所有数据。
在此先感谢您的帮助!
编辑
为了进一步说明我的意图,这里有一个更复杂的查询。我可以使用 OPTIONAL 而不是 UNION 来编写相同的查询。但是当我使用 OPTIONAL 时,结果集中的行数保持快速增长,每个 OPTIONAL 块 returns 的命中率越高。如果两个块 return 多次命中,则结果包含 hits1*hits2 记录。我认为我可以通过在高级别使用 UNION 使它更可预测并将其保持在 hits1+hits2 内。是否存在显着的性能差异?
SELECT DISTINCT ?Patient ?Gender ?Neoplastic_Process ?MStage ?TStage
WHERE {
?Patient a nci:C16960 .
{
?Patient roo:100018 ?Gender .
?Gender a ?GenderType .
}
UNION { -- SHOULD I USE OPTIONAL HERE INSTEAD (And for the block above?)
?Patient roo:100008 ?Neoplastic_Process .
?Neoplastic_Process a ?Neoplastic_ProcessType .
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
?MStage a ?MStageType .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
?TStage a ?TStageType .
}
}
}
我想当我使用 OPTIONAL 而不是 UNION 添加到结果集时,我分离查询条件的问题没有发挥作用,因为它都是同一个块的一部分。
SPARQL 执行被定义为功能性的,即。自下而上。同理(1+2) * 3
表示计算1+2
,那么*
或者double(1+2)
表示计算1+2
然后传3
,而不是[=14] =] 到 double
.
{
BIND(bound(?Patient) as ?bound1) .
}
计算然后与
合并(通过连接)
?Patient a nci:C16960 .
?Patient roo:100018 ?gender .
?gender a nci:C20197 .
所以
{
BIND(bound(?Patient) as ?bound1) .
}
已解绑?Patient
引擎会分析查询并以不同的方式在内部执行,但前提是它获得相同的结果。
在 UNION
的不同部分重复较小的图案可能更容易。对于较大的模式,为避免重复考虑子选择或可选以扩展结果。 (问题中的例子看起来像是一个简化,所以很难说出最好的方法。)
编辑问题后回答。
看这部分:
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
?MStage a ?MStageType .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
?TStage a ?TStageType .
}
这将产生所有匹配项 ?MStage
/?MStageType
与 ?TStage
/?TStageType
的叉积。
我不知道你的数据的形状,但也许这种简化将是前进的一步:你可以去掉所有不在 SELECT
中的东西并简化:
SELECT ?Patient ?Gender ?Neoplastic_Process ?MStage ?TStage
WHERE {
?Patient a nci:C16960 .
?Patient roo:100018 ?Gender .
?Patient roo:100008 ?Neoplastic_Process .
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
}
}
根据数据的外观,以及您是否需要 ?MStage
和 ?TStage
的两个不同变量,其他事情可能也是可能的。
在针对 Sesame 内存存储的 Sparql 查询中,我想分离我的查询条件,例如"Patient is male" 来自生成查询结果的其余查询。
让我们考虑这个简单的查询:
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX nci:<http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#>
PREFIX roo: <http://www.cancerdata.org/roo/>
SELECT DISTINCT *
WHERE {
?Patient a nci:C16960 .
?Patient roo:100018 ?gender .
?gender a nci:C20197 .
BIND(bound(?Patient) as ?bound0) .
{
BIND(bound(?Patient) as ?bound1) .
}
UNION {
?Patient a nci:C16960 .
BIND(bound(?Patient) as ?bound2) .
}
}
Bound0 始终为真(正如预期的那样)。 Bound1 始终为 false,而 Bound2 在结果集中根本没有值(有和没有额外的 ?Patient 三元组)。
这是否意味着 ?Patient 变量在第一个块中已知,但未绑定并且在第二个块中根本不存在(即使我再次声明它)?为什么会有不同?
我的目标是先定义复杂的查询条件,然后将结果集缩减为仅匹配所有条件的患者。然后使用已经减少的 ?Patient 来收集输出中请求的所有数据。
在此先感谢您的帮助!
编辑
为了进一步说明我的意图,这里有一个更复杂的查询。我可以使用 OPTIONAL 而不是 UNION 来编写相同的查询。但是当我使用 OPTIONAL 时,结果集中的行数保持快速增长,每个 OPTIONAL 块 returns 的命中率越高。如果两个块 return 多次命中,则结果包含 hits1*hits2 记录。我认为我可以通过在高级别使用 UNION 使它更可预测并将其保持在 hits1+hits2 内。是否存在显着的性能差异?
SELECT DISTINCT ?Patient ?Gender ?Neoplastic_Process ?MStage ?TStage
WHERE {
?Patient a nci:C16960 .
{
?Patient roo:100018 ?Gender .
?Gender a ?GenderType .
}
UNION { -- SHOULD I USE OPTIONAL HERE INSTEAD (And for the block above?)
?Patient roo:100008 ?Neoplastic_Process .
?Neoplastic_Process a ?Neoplastic_ProcessType .
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
?MStage a ?MStageType .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
?TStage a ?TStageType .
}
}
}
我想当我使用 OPTIONAL 而不是 UNION 添加到结果集时,我分离查询条件的问题没有发挥作用,因为它都是同一个块的一部分。
SPARQL 执行被定义为功能性的,即。自下而上。同理(1+2) * 3
表示计算1+2
,那么*
或者double(1+2)
表示计算1+2
然后传3
,而不是[=14] =] 到 double
.
{
BIND(bound(?Patient) as ?bound1) .
}
计算然后与
合并(通过连接)?Patient a nci:C16960 .
?Patient roo:100018 ?gender .
?gender a nci:C20197 .
所以
{
BIND(bound(?Patient) as ?bound1) .
}
已解绑?Patient
引擎会分析查询并以不同的方式在内部执行,但前提是它获得相同的结果。
在 UNION
的不同部分重复较小的图案可能更容易。对于较大的模式,为避免重复考虑子选择或可选以扩展结果。 (问题中的例子看起来像是一个简化,所以很难说出最好的方法。)
编辑问题后回答。
看这部分:
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
?MStage a ?MStageType .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
?TStage a ?TStageType .
}
这将产生所有匹配项 ?MStage
/?MStageType
与 ?TStage
/?TStageType
的叉积。
我不知道你的数据的形状,但也许这种简化将是前进的一步:你可以去掉所有不在 SELECT
中的东西并简化:
SELECT ?Patient ?Gender ?Neoplastic_Process ?MStage ?TStage
WHERE {
?Patient a nci:C16960 .
?Patient roo:100018 ?Gender .
?Patient roo:100008 ?Neoplastic_Process .
OPTIONAL {
?Neoplastic_Process roo:100241 ?MStage .
}
OPTIONAL {
?Neoplastic_Process roo:100244 ?TStage .
}
}
根据数据的外观,以及您是否需要 ?MStage
和 ?TStage
的两个不同变量,其他事情可能也是可能的。