首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARQL连接两个图:值优先?

SPARQL连接两个图:值优先?
EN

Stack Overflow用户
提问于 2016-01-26 14:52:34
回答 1查看 226关注 0票数 2

我有两个图表,其中包含在临床试验中注册的数值。每个图都有不完整的注册记录,所以我想将这些图组合起来,以获得更完整的注册值列表。

KMD图应该优先。如果注册同时出现在KMD图和KCTGOV图中,请使用来自KMD的值。如果KMD中缺少注册,请使用来自KCTGOV的注册值。

下面的查询非常接近:通过成功地加入?nctId值,我从每个图中获得了注册值。然后,我如何为?注册创建一个结果,即在该图形中出现的KMD或在KMD中缺少值时来自KCTGOV的结果?下面的代码创建名为enrollKMD和enrollKCT的单独注册列。我需要那些列的合并。

建议非常感谢!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-26 20:01:58

您可以使用IF操作来完成此操作,如下所示:

代码语言:javascript
复制
select (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)
where ...

IF操作符检查?enrollkmd是否绑定到某个值,如果绑定,则返回该值,否则返回?enrollKCT的值。然后,操作符的结果绑定到查询结果中的?enrollment变量。

当然,由于不再使用通配符-select ('*'),现在需要显式地添加所有要返回的变量。因此,完整的select子句将变成如下所示:

代码语言:javascript
复制
select ?obs ?orgId ?nctId (if(bound(?enrollkmd), ?enrollkmd, ?enrollKCT) as ?enrollment)

适应口味。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35016732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档