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)

适应口味。