代码之家  ›  专栏  ›  技术社区  ›  Ania David

如何从CONSTRUCT在图上创建聚合

  •  2
  • Ania David  · 技术社区  · 9 年前

    这是我的疑问:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX rs: <http://www.welovethesemanticweb.com/rs#>
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
        construct {
      ?subject0 rs:similarityValue ?similairty0.
        ?subject1 rs:similarityValue ?similairty1
    }
    WHERE {
    
      {
      ?subject0 ?predicate0 ?object0.
      rs:Impromptu_No._1 ?predicate0 ?object0.
        ?predicate0 rs:hasSimilarityValue ?similairty0Helper.
        BIND(?similairty0Helper * (4/9) AS ?similairty0)
        FILTER (?subject0 != rs:Impromptu_No)  
      }
      union {
        ?subject1 ?predicate ?object.
        ?object ?predicate1 ?object1.
        ?predicate1 rs:hasSimilarityValue ?similairty1Helper.
        rs:Impromptu_No._1 ?predicateHelper ?objectHelper.
        ?objectHelper ?predicate1 ?object1
          BIND(?similairty1Helper * (1/9) AS ?similairty1)
        FILTER (?subject1 != rs:Impromptu_No._1)
      }
    }
    

    结果是:

    rs:5th_Symphony
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Polonaise_heroique
          rs:similarityValue
                0.011111111111111112e0 , 0.17777777777777778e0 , 0.26666666666666666e0 .
    
    rs:Preludes
          rs:similarityValue
                0.011111111111111112e0 , 0.26666666666666666e0 , 0.17777777777777778e0 .
    
    rs:Requiem_Sequentia
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Le_nozze_di_Figaro
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Symphony_No._29_in_A_major
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Piano_Concerto_No._24
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Impromptu_No._1
          rs:similarityValue
                0.26666666666666666e0 , 0.17777777777777778e0 .
    
    rs:Sonata_Pathetique
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Dies_Irae
          rs:similarityValue
                0.011111111111111112e0 .
    
    rs:Piano_Sonata_No._31
          rs:similarityValue
                0.011111111111111112e0 , 0.26666666666666666e0 .
    
    rs:Violin_Concerto_No._5_in_A_major
          rs:similarityValue
                0.011111111111111112e0 .
    

    正如您所看到的,对于每个实例,都有许多值,我希望将它们聚合起来,并使 SUM 对于每个实例。我会这么做的 SELECT ,但具有 CONSTRUCT ,我不知道如何应用聚合。

    阅读后,我发现我们不能直接从 构造 ,但我需要使用 选择 构造 总之,我似乎必须使用名为“命名图”的东西,但即使我试过也不知道该怎么做。

    非常感谢你的帮助。

    非常感谢,致以最诚挚的问候,

    更新1

    我尝试过的方法之一是:

    construct {
      ?subject0 rs:similarityValue ?similairty0.
        ?subject1 rs:similarityValue ?similairty1
    }
    WHERE {
      GRAPH ?g  {?subject0 rs:similarityValue ?similairty0}.
      {
      ?subject0 ?predicate0 ?object0.
    ....
    

    但我得到了空结果

    1 回复  |  直到 9 年前
        1
  •  5
  •   Joshua Taylor    9 年前

    首先,最好确保您可以选择要检索的所有信息。看起来你的目标是这样的:

    prefix rs: <http://www.welovethesemanticweb.com/rs#>
    
    select distinct ?s ?weight ?factor where {
      #-- ?x is the special value of interest.  This
      #-- is pulled out into a VALUES block just for
      #-- convenience; there's just one place to change
      #-- rs:Impromptu_No._1, now.
      values ?x { rs:Impromptu_No._1 }
    
      #-- find ?s which are "one step" away from
      #-- a common property/value with ?x, and
      #-- take 4/9 as ?weight.
      {
        ?s ?p ?o .
        ?x ?p ?o .
        bind(4/9 as ?weight)
      }
      union
      #-- find ?s which are are "two steps" away from
      #-- a common property/value with ?x, and take
      #-- 1/9 as ?weight
      {
        ?s ?a ?b . ?b ?p ?o .
        ?x ?c ?d . ?d ?p ?o .
        bind(1/9 as ?weight)
      }
    
      #-- get the similarity factor of the property
      #-- and make sure that ?s is different from ?x.
      ?p rs:hasSimilarityValue ?factor .
      filter(?s != ?x)
    }
    
    -----------------------------------------------------------------------------------------------------------------------
    | s                                   | weight                     | factor                                           |
    =======================================================================================================================
    | rs:5th_Symphony                     | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Dies_Irae                        | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Le_nozze_di_Figaro               | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Piano_Concerto_No._24            | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Piano_Sonata_No._31              | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Piano_Sonata_No._31              | 0.444444444444444444444444 | "0.6"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Polonaise_heroique               | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Polonaise_heroique               | 0.444444444444444444444444 | "0.4"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Polonaise_heroique               | 0.444444444444444444444444 | "0.6"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Preludes                         | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Preludes                         | 0.444444444444444444444444 | "0.4"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Preludes                         | 0.444444444444444444444444 | "0.6"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Requiem_Sequentia                | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Sonata_Pathetique                | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Symphony_No._29_in_A_major       | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    | rs:Violin_Concerto_No._5_in_A_major | 0.111111111111111111111111 | "0.1"^^<http://www.w3.org/2001/XMLSchema#double> |
    -----------------------------------------------------------------------------------------------------------------------
    

    现在看来,在这之后,你想 分组依据 按的值 ?s 并将加权相似度相加:

    select distinct ?s (sum(?weight * ?factor) as ?similarity) where {
      values ?x { rs:Impromptu_No._1 }
      {
        ?s ?p ?o .
        ?x ?p ?o .
        bind(4/9 as ?weight)
      }
      union
      {
        ?s ?a ?b . ?b ?p ?o .
        ?x ?c ?d . ?d ?p ?o .
        bind(1/9 as ?weight)
      }
    
      ?p rs:hasSimilarityValue ?factor .
      filter(?s != ?x)
    }
    group by ?s
    
    ----------------------------------------------------------------
    | s                                   | similarity             |
    ================================================================
    | rs:5th_Symphony                     | 0.044444444444444446e0 |
    | rs:Piano_Concerto_No._24            | 0.044444444444444446e0 |
    | rs:Requiem_Sequentia                | 0.044444444444444446e0 |
    | rs:Dies_Irae                        | 0.044444444444444446e0 |
    | rs:Piano_Sonata_No._31              | 0.31111111111111117e0  |
    | rs:Symphony_No._29_in_A_major       | 0.044444444444444446e0 |
    | rs:Le_nozze_di_Figaro               | 0.044444444444444446e0 |
    | rs:Violin_Concerto_No._5_in_A_major | 0.044444444444444446e0 |
    | rs:Sonata_Pathetique                | 0.044444444444444446e0 |
    | rs:Preludes                         | 0.48888888888888893e0  |
    | rs:Polonaise_heroique               | 0.48888888888888893e0  |
    ----------------------------------------------------------------
    

    最后,既然你已经找到了你想要的价值观,你现在可以 建筑 你想要的三倍:

    construct {
      ?s rs:similarityValue ?similarity
    }
    where {{
      select distinct ?s (sum(?weight * ?factor) as ?similarity) where {
        values ?x { rs:Impromptu_No._1 }
        {
          ?s ?p ?o .
          ?x ?p ?o .
          bind(4/9 as ?weight)
        }
        union
        {
          ?s ?a ?b . ?b ?p ?o .
          ?x ?c ?d . ?d ?p ?o .
          bind(1/9 as ?weight)
        }
        ?p rs:hasSimilarityValue ?factor .
        filter(?s != ?x)
      }
      group by ?s
    }}
    
    @prefix :      <http://www.semanticweb.org/rs#> .
    @prefix rs:    <http://www.welovethesemanticweb.com/rs#> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    @prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
    @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
    
    rs:5th_Symphony  rs:similarityValue  0.044444444444444446e0 .
    
    rs:Polonaise_heroique
            rs:similarityValue  0.48888888888888893e0 .
    
    rs:Preludes  rs:similarityValue  0.48888888888888893e0 .
    
    rs:Requiem_Sequentia  rs:similarityValue
                    0.044444444444444446e0 .
    
    rs:Le_nozze_di_Figaro
            rs:similarityValue  0.044444444444444446e0 .
    
    rs:Symphony_No._29_in_A_major
            rs:similarityValue  0.044444444444444446e0 .
    
    rs:Piano_Concerto_No._24
            rs:similarityValue  0.044444444444444446e0 .
    
    rs:Sonata_Pathetique  rs:similarityValue
                    0.044444444444444446e0 .
    
    rs:Dies_Irae  rs:similarityValue  0.044444444444444446e0 .
    
    rs:Piano_Sonata_No._31
            rs:similarityValue  0.31111111111111117e0 .
    
    rs:Violin_Concerto_No._5_in_A_major
            rs:similarityValue  0.044444444444444446e0 .