Variables 块外部的Sparql变量未绑定到块内部
在针对Sesame内存存储的Sparql查询中,我想将我的查询条件(例如“Patient is male”)与生成查询结果的查询的其余部分分开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/
让我们考虑一下这个简单的查询:
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 .
}