我有两个图表,其中包含在临床试验中注册的数值。每个图都有不完整的注册记录,所以我想将这些图组合起来,以获得更完整的注册值列表。
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发布于 2016-01-26 20:01:58
您可以使用IF操作来完成此操作,如下所示:
select (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
where ...IF操作符检查?enrollkmd是否绑定到某个值,如果绑定,则返回该值,否则返回?enrollKCT的值。然后,操作符的结果绑定到查询结果中的?enrollment变量。
当然,由于不再使用通配符-select ('*'),现在需要显式地添加所有要返回的变量。因此,完整的select子句将变成如下所示:
select ?obs ?orgId ?nctId (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)适应口味。
https://stackoverflow.com/questions/35016732
复制相似问题