Variables 块外部的Sparql变量未绑定到块内部

Variables 块外部的Sparql变量未绑定到块内部,variables,union,sparql,Variables,Union,Sparql,在针对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/

在针对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) .
  } 
} 

我想,当我使用OPTIONAL来添加到结果集而不是联合时,我分离查询条件的问题不会起作用,因为它都是同一块的一部分。

SPARQL执行被定义为功能性的,即自底向上。同样地,
(1+2)*3
表示计算
1+2
,然后执行
*
double(1+2)
表示计算
1+2
并传递
3
,而不是
1+2
double

{ 
    BIND(bound(?Patient) as ?bound1) .
}
然后计算(与联接)与

所以

已解除绑定
?患者

引擎确实以不同的方式分析查询并在内部执行,但前提是它得到相同的结果


联合体的不同部分重复较小的模式可能更容易。对于较大的模式,避免重复考虑子选择或可选的扩展结果。(问题中的示例看起来很简单,因此很难说出最佳方法。)

SPARQL执行被定义为功能性的,即自底向上。同样地,
(1+2)*3
表示计算
1+2
,然后执行
*
double(1+2)
表示计算
1+2
并传递
3
,而不是
1+2
double

{ 
    BIND(bound(?Patient) as ?bound1) .
}
然后计算(与联接)与

所以

已解除绑定
?患者

引擎确实以不同的方式分析查询并在内部执行,但前提是它得到相同的结果


联合体的不同部分重复较小的模式可能更容易。对于较大的模式,避免重复考虑子选择或可选的扩展结果。(问题中的示例看起来很简单,因此很难说出最佳方法。)

编辑问题后回答

看看这部分:

    OPTIONAL { 
     ?Neoplastic_Process roo:100241 ?MStage . 
     ?MStage a ?MStageType . 
    } 
    OPTIONAL { 
     ?Neoplastic_Process roo:100244 ?TStage . 
     ?TStage a ?TStageType . 
    }
这将产生所有匹配的
?MStage
/
?MStageType
?TStage
/
?TStageType
的叉积

我不知道您的数据的形状,但这种简化可能是前进的一步:您可以取出
中没有的所有内容,选择
并简化:


选择?患者?性别?肿瘤_过程?MStage?TStage
何处{
?患者a nci:C16960。
?患者roo:100018?性别。
?患者roo:100008?肿瘤性_过程。
可选{
?肿瘤性_工艺roo:100241?MStage。
} 
可选{
?肿瘤性_工艺roo:100244?t阶段。
} 
}

根据数据的外观,以及您是否需要
?MStage
?TStage
的两个不同变量,可能还需要做其他事情

问题编辑后回答

看看这部分:

    OPTIONAL { 
     ?Neoplastic_Process roo:100241 ?MStage . 
     ?MStage a ?MStageType . 
    } 
    OPTIONAL { 
     ?Neoplastic_Process roo:100244 ?TStage . 
     ?TStage a ?TStageType . 
    }
这将产生所有匹配的
?MStage
/
?MStageType
?TStage
/
?TStageType
的叉积

我不知道您的数据的形状,但这种简化可能是前进的一步:您可以取出
中没有的所有内容,选择
并简化:


选择?患者?性别?肿瘤_过程?MStage?TStage
何处{
?患者a nci:C16960。
?患者roo:100018?性别。
?患者roo:100008?肿瘤性_过程。
可选{
?肿瘤性_工艺roo:100241?MStage。
} 
可选{
?肿瘤性_工艺roo:100244?t阶段。
} 
}

根据数据的外观,以及您是否需要
?MStage
?TStage
的两个不同变量,可能还需要做其他事情

谢谢你的信息!我编辑了我的问题。我主要关心的是防止结果集中的行数快速增长并包含冗余信息。这就是当许多子块返回多个点击并使用可选的。您认为通常性能更好的是什么?谢谢您提供的信息!我编辑了我的问题。我主要关心的是防止结果集中的行数快速增长并包含冗余信息。这就是当许多子块返回多个点击并使用可选的。您认为什么是通常更好的性能?“我的目标是首先定义复杂的查询条件,并将结果集减少到仅匹配所有条件的患者。然后使用已经减少的患者收集输出中请求的所有数据。”您认为为什么这是必要的?这是查询优化器的工作。Sesame的默认SPARQL引擎通常非常擅长为您进行此类优化。“我的目标是首先定义复杂的查询条件,并将结果集减少到仅匹配所有条件的患者。然后使用已经减少的患者收集输出中请求的所有数据。”你为什么认为这是必要的?这是查询优化器的工作。Sesame的默认SPARQL引擎通常非常擅长为您进行此类优化。很抱歉将“类型”模式留在这里。通常在查询中,会有更多基于类型的模式,这些模式将位于SELECT中,例如
MStageType rdfs:label?MStageLabel
。在上面的简化示例中,我还可以使用UNION添加MStage和TStage。如果有1名患者有1种性别和1种疾病(肿瘤过程),且该疾病有3个Mstage和4个Tstage,则OPTIONAL将生成12行。如果我使用UNION,它将生成7。这个假设正确吗?如果是这样的话,从一个典型的查询性能的角度来看,什么会更好呢?可能是正确的-我不知道您的数据,所以虽然它看起来不错,但我说不出来。但它的计算方式
    OPTIONAL { 
     ?Neoplastic_Process roo:100241 ?MStage . 
     ?MStage a ?MStageType . 
    } 
    OPTIONAL { 
     ?Neoplastic_Process roo:100244 ?TStage . 
     ?TStage a ?TStageType . 
    }