SPARQL 连接两个图:值优先级?
SPARQL Join two graphs : value precedence?
我有两张图表,其中包含临床试验的注册值。每个图表都有不完整的注册记录,因此我想合并这些图表以获得更完整的注册值列表。
KMD 图应该优先。如果 KMD 图形和 KCTGOV 图形中都存在注册,则使用 KMD 中的值。如果 KMD 中缺少注册,请使用 KCTGOV 中的注册值。
我正在接近下面的查询:我通过成功加入 ?nctId 的值从每个图中引入注册值。然后,我如何为该图表中存在的来自 KMD 的 ?enrollment 创建结果,或者当 KMD 中缺少该值时来自 KCTGOV 的结果?下面的代码创建了名为 enrollKMD 和 enrollKCT 的单独注册列。我需要合并这些列。
非常感谢建议!
PREFIX kmd: <http://www.example.org/kmd/>
PREFIX lct: <http://data.linkedct.org/vocab/resource/>
SELECT *
FROM NAMED <http://localhost:8890/KMD>
FROM NAMED <http://localhost:8890/KCTGOV>
WHERE
{
GRAPH <http://localhost:8890/KMD>
{
?obs a kmd:Study ;
kmd:hasOrgId ?orgId .
OPTIONAL
{
?obs kmd:hasNctId ?nctIdURI .
}
OPTIONAL {?obs kmd:hasEnrollment ?enrollkmd.}
# Create STR of NCTID for merge
BIND(strafter(str(?nctIdURI), "kmd/") AS ?nctId )
}
OPTIONAL
{
GRAPH <http://localhost:8890/KCTGOV>
{
OPTIONAL{ ?govNctIdURI lct:enrollment ?enrollKCT.}
# Create STR of NCTID for merge
BIND(UCASE(strafter(str(?govNctIdURI), "trial/")) AS ?nctId )
}
}
}ORDER BY ?orgId
您可以使用 IF
操作来执行此操作,如下所示:
select (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
where ...
IF
运算符检查 ?enrollkmd
是否绑定到一个值,如果是,它 returns 那个值,否则它 returns [=15] 的值=].然后将运算符的结果绑定到查询结果中的 ?enrollment
变量。
当然,因为您不再使用 wildcard-select ('*'),您现在需要显式添加您想要返回的所有变量。所以完整的select-clause会变成这样:
select ?obs ?orgId ?nctId (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
适应口味。
我有两张图表,其中包含临床试验的注册值。每个图表都有不完整的注册记录,因此我想合并这些图表以获得更完整的注册值列表。
KMD 图应该优先。如果 KMD 图形和 KCTGOV 图形中都存在注册,则使用 KMD 中的值。如果 KMD 中缺少注册,请使用 KCTGOV 中的注册值。
我正在接近下面的查询:我通过成功加入 ?nctId 的值从每个图中引入注册值。然后,我如何为该图表中存在的来自 KMD 的 ?enrollment 创建结果,或者当 KMD 中缺少该值时来自 KCTGOV 的结果?下面的代码创建了名为 enrollKMD 和 enrollKCT 的单独注册列。我需要合并这些列。
非常感谢建议!
PREFIX kmd: <http://www.example.org/kmd/>
PREFIX lct: <http://data.linkedct.org/vocab/resource/>
SELECT *
FROM NAMED <http://localhost:8890/KMD>
FROM NAMED <http://localhost:8890/KCTGOV>
WHERE
{
GRAPH <http://localhost:8890/KMD>
{
?obs a kmd:Study ;
kmd:hasOrgId ?orgId .
OPTIONAL
{
?obs kmd:hasNctId ?nctIdURI .
}
OPTIONAL {?obs kmd:hasEnrollment ?enrollkmd.}
# Create STR of NCTID for merge
BIND(strafter(str(?nctIdURI), "kmd/") AS ?nctId )
}
OPTIONAL
{
GRAPH <http://localhost:8890/KCTGOV>
{
OPTIONAL{ ?govNctIdURI lct:enrollment ?enrollKCT.}
# Create STR of NCTID for merge
BIND(UCASE(strafter(str(?govNctIdURI), "trial/")) AS ?nctId )
}
}
}ORDER BY ?orgId
您可以使用 IF
操作来执行此操作,如下所示:
select (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
where ...
IF
运算符检查 ?enrollkmd
是否绑定到一个值,如果是,它 returns 那个值,否则它 returns [=15] 的值=].然后将运算符的结果绑定到查询结果中的 ?enrollment
变量。
当然,因为您不再使用 wildcard-select ('*'),您现在需要显式添加您想要返回的所有变量。所以完整的select-clause会变成这样:
select ?obs ?orgId ?nctId (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
适应口味。