我有两张图表,其中包含临床试验中的登记值。每个图表都有不完整的注册记录,所以我想结合图表来获得更完整的注册值列表。
KMD图应该优先。如果KMD图和KCTGOV图中都存在注册,请使用KMD中的值。如果KMD中缺少注册,请使用KCTGOV的注册值。
我接近下面的查询:我通过成功加入?nctId的值来引入每个图表的注册值。然后,我如何为该图表中的KMD创建?注册结果,或者当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
答案 0 :(得分:1)
您可以使用IF
操作执行此操作,如下所示:
select (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
where ...
IF
运算符检查?enrollkmd
是否绑定了某个值,如果是,则返回该值,否则返回?enrollKCT
的值。然后,运算符的结果将绑定到查询结果中的?enrollment
变量。
当然,由于您不再使用通配符选择(&#39; *&#39;),您现在需要显式添加要返回的所有变量。所以完整的select子句将变成这样:
select ?obs ?orgId ?nctId (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
适应口味。