【问题标题】:Create new triplets based on a query result根据查询结果创建新的三元组
【发布时间】:2020-06-16 04:16:24
【问题描述】:

[![在此处输入图片描述][1]][1][1]:https://i.stack.imgur.com/AG7MM.png

给定以下三元组

我想得到一个结果 :crr1 :hasPart :part1 :crr2 :hasPart :part3

我目前尝试了下面的查询,但我没有得到预期的结果我试图在两个查询的 UNION 上放置一个过滤器 FILTER (?part = ?part2) 但未能得到我需要的响应,什么我在这里做错了吗?

我查询的唯一目的是查找缺失的连接,例如在这种情况下,如果 CRR1 和 CRR2 通过 Part2 连接,那么我想创建一个新的 CRR,根据谁是本例中的 DOB 来连接 Part1 和 Part3是CRR1

:crr1 a :XObject .
:crr2 a :XObject .
:crr3 a :XObject .
:crr4 a :XObject .

:part1 a :Part
:part2 a :Part
:part3 a :Part
:part4 a :Part
:part5 a :Part

:crr1 :hasPart :part1 .
:crr1 :hasPart :part2 .
:crr2 :hasPart :part2 .
:crr2 :hasPart :part3 .
:crr3 :hasPart :part3 .
:crr3 :hasPart :part4 .
:crr4 :hasPart :part4 .
:crr4 :hasPart :part5 .

:crr1 :hasType :DOB .



PREFIX : <http://example.com/test#> 
construct {

?o :hasPart ?part .
:crr2 :hasPart ?part2 .
}
where
{
    {
  ?o :hasPart ?part
  {
    select DISTINCT ?o
      where {
      :crr2 (:hasPart/^:hasPart)+ ?o
      FILTER (:crr2 != ?o)
      }
  }
  FILTER EXISTS {?o :hasType :DOB .}
    }
    UNION
    {
        :crr2 :hasPart ?part2 .
    }
 FILTER (?part = ?part2)
}



【问题讨论】:

    标签: sparql rdf jena ontology


    【解决方案1】:

    我不确定我是否正确理解了你的问题,但让我试着回答一下。

    如果您希望在 :crr1 和 :part3 之间构造一个三元组,则 你的问题的第 3 段暗示,那么你需要这样的东西:

    PREFIX : <http://example.com/test#>
    
    CONSTRUCT {?dob :hasPart ?part}
    WHERE {
    ?dob :hasType :DOB .
    ?dob :hasPart ?p .
    ?otherCRR :hasPart ?p.
    FILTER(?dob != ?otherCRR)
    #The above establishes whether the DOB CRR and another one are connected via any part
    ?otherCRR :hasPart ?part .
    FILTER NOT EXISTS {?dob :hasPart ?part}
    #This instead makes sure that there isn't already a connection between the DOB and the part in question.
    }
    

    如果您正在寻找 :crr2 的部分,这些部分不与存在某些连接且另一个 CRR 是 DOB 的任何其他 CRR 共享,正如您问题的第一段似乎暗示的那样,那么您需要类似这个:

    PREFIX : <http://example.com/test#>
    
    CONSTRUCT {
    ?o :hasPart ?part .
    :crr2 :hasPart ?part2 .
    }
    WHERE{
    ?o :hasPart ?sharedPart, ?part .
    ?o :hasType :DOB .
    FILTER(?sharedPart != ?part)
    :crr2 :hasPart ?sharedPart, ?part2 .
    FILTER NOT EXISTS {?o :hasPart ?part2}
    FILTER NOT EXISTS {:crr2 :hasPart ?part}
    }
    

    这将返回您所追求的三元组。 请注意,在您的过滤器中,您说 ?part 和 ?part2 必须相同,因此您不能在返回的三元组中分别将它们作为 :part1 和 :part3。

    您可能还感兴趣的是,您可以使用插入查询将三元组直接插入到图表中。只需将 CONSTRUCT 替换为 INSERT。

    【讨论】:

    • 很抱歉,我可能不清楚正确编写用例,但让我再试一试,用例是
    • 假设有一个 CRR1 有 2 个部分第 1 部分和第 2 部分,我有另一个 CRR2 有第 2 部分和第 3 部分,而 CRR3 有第 3 部分和第 4 部分,在这种情况下,以免将 CRR1 视为 DOB 所以现在我需要创建一个 VCRR 来连接 Part1 和 Part3 以及 Part1 和 Part4
    • 我还是不太清楚,抱歉。您想完全创建一个新的 CRR 吗?如果是这样,我倾向于使用这样的东西: BIND(IRI(CONCAT(STR(?CRR),"_somestring")) AS ?newCRR)
    • 是的,正确我已经在问题中添加了一个图像,所以这是我称之为虚拟 crr 的绿色气泡,我需要创建给定特定 crr 我需要找到它的所有部分并连接那些不存在
    • 我明白了,所以你想在任何两个尚未连接的部分之间建立一个虚拟 crr?但是 DOB 是从哪里来的呢?
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2019-08-24
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多