SPARQL加入两个图:值优先级?

时间:2016-01-26 14:52:34

标签: left-join sparql

我有两张图表,其中包含临床试验中的登记值。每个图表都有不完整的注册记录,所以我想结合图表来获得更完整的注册值列表。

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

1 个答案:

答案 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)

适应口味。