我在使用netbeans或Sparql吗?

时间:2013-07-20 15:07:40

标签: sparql ontology protege

我的项目中有一个问题。 我不知道我是否需要工作netbeans。 我的工作是关于推荐系统的图书馆书籍。作为输入我需要书籍分类本体。在我的本体论中对图书馆书籍进行了分类。这个分类有14个类别,除了兄弟类作者,书,伊斯本。书籍类中的个人是书的主题(约600个主题),作者类中的个人是姓名的作者,也是isbn类。

我也收集了并且手动将部分归属于类别的书。对象属性是名称“hasSubject”与个别书类相关的类别。示例书“A”具有主题类别“S”和“F”以及.... 但作为最终结果,我想应用这个公式:

sim(x,y)=(C1,1)/(C1,0 + C0,1 + C1,1)

其中C1,1表示预订“X”和书籍“Y”属于它的类别数。(他们) 和C1,0表示书“X”属于它们的类别数,但书“Y”不属于它们。 并且C0,1表示书“y”属于它们但是书“x”不属于它们的类别的数量。 最后,在两本书(“A”和“B”)之间获得相似性。不再将此公式应用于预订“A”并预订“C”等。直到所有书籍之间获得相似性。 现在您的意见这项工作由netbeans或sparql在protégé中完成?

我想也许我可以告诉我,如果我在每本书中都有表示的hasSibinling属性Compute该小组已经与她分享了这些书。(你觉得我是什么)

1 个答案:

答案 0 :(得分:1)

您可以使用SPARQL计算这种指标,尽管它有点难看。让我们假设一些这样的数据:

prefix dcterms: <http://purl.org/dc/terms/>
prefix : <http://example.org/books/>

:book1 a :Book ; dcterms:subject :subject1 , :subject2, :subject3 .
:book2 a :Book ; dcterms:subject :subject2 , :subject3, :subject4 .
:book3 a :Book ; dcterms:subject :subject4 , :subject5 .

有三本书。第1和第2册有两个共同的主题,另一个没有共同的主题。第2册和第3册有一个共同的主题,但第2册有2本书3没有,而第3册只有第2册没有,第1和第3册没有共同的主题。

这里的技巧是使用一些嵌套的子查询,并在嵌套中的不同级别获取不同的值(C10,C01和C11)。最里面的查询是

select ?book1 ?book2 (count(?left) as ?c10) where {
  :Book ^a ?book1, ?book2 .
  FILTER( !sameTerm(?book1,?book2) )
  OPTIONAL { 
    ?book1 dcterms:subject ?left .
    FILTER NOT EXISTS { ?book2 dcterms:subject ?left }
  }
}
group by ?book1 ?book2

它抓住每对不同的书籍并计算左书所具有的权利数量。通过将其包装在另一个查询中,我们可以获取左边没有的正确书籍的主题数量。这使得查询:

select ?book1 ?book2 (count(?right) as ?c01x) (sample(?c10) as ?c10x) where {
  {
    select ?book1 ?book2 (count(?left) as ?c10) where {
      :Book ^a ?book1, ?book2 .
      FILTER( !sameTerm(?book1,?book2) )
      OPTIONAL { 
        ?book1 dcterms:subject ?left .
        FILTER NOT EXISTS { ?book2 dcterms:subject ?left }
      }
    }
    group by ?book1 ?book2
  }

  OPTIONAL { 
    ?book2 dcterms:subject ?right .
    FILTER NOT EXISTS { ?book1 dcterms:subject ?right }
  }
}
group by ?book1 ?book2 

请注意,我们仍然需要选择?book1?book2以及sample(?c10) as ?c10x才能向外传递值。 (我们必须使用?c10x,因为名称?c10已经在此范围内使用。最后,我们将此包装在另一个查询中以获取常见主题,并进行计算,这给了我们:

prefix dcterms: <http://purl.org/dc/terms/> 
prefix : <http://example.org/books/> 

select ?book1 ?book2 
       (count(?both) as ?c11)
       (sample(?c10x) as ?c10)
       (sample(?c01x) as ?c01)
       (count(?both) / (count(?both) + sample(?c10x) + sample(?c01x)) as ?sim)
where {
  {
    select ?book1 ?book2 (count(?right) as ?c01x) (sample(?c10) as ?c10x) where {
      {
        select ?book1 ?book2 (count(?left) as ?c10) where {
          :Book ^a ?book1, ?book2 .
          FILTER( !sameTerm(?book1,?book2) )
          OPTIONAL { 
            ?book1 dcterms:subject ?left .
            FILTER NOT EXISTS { ?book2 dcterms:subject ?left }
          }
        }
        group by ?book1 ?book2
      }

      OPTIONAL { 
        ?book2 dcterms:subject ?right .
        FILTER NOT EXISTS { ?book1 dcterms:subject ?right }
      }
    }
    group by ?book1 ?book2 
  }

  OPTIONAL { 
    ?both ^dcterms:subject ?book1, ?book2 .
  }
}
group by ?book1 ?book2
order by ?book1 ?book2

这个相当怪异的查询应用于我们的数据,计算这些结果:

$ arq --data data.n3 --query similarity.sparql
--------------------------------------------
| book1  | book2  | c11 | c10 | c01 | sim  |
============================================
| :book1 | :book2 | 2   | 1   | 1   | 0.5  |
| :book1 | :book3 | 0   | 3   | 2   | 0.0  |
| :book2 | :book1 | 2   | 1   | 1   | 0.5  |
| :book2 | :book3 | 1   | 2   | 1   | 0.25 |
| :book3 | :book1 | 0   | 2   | 3   | 0.0  |
| :book3 | :book2 | 1   | 1   | 2   | 0.25 |
--------------------------------------------

如果删除FILTER( !sameTerm(?book1,?book2) )行,以便计算每本书与其自身的相似度,我们会看到正确的值(1.0):

$ arq --data data.n3 --query similarity.sparql
--------------------------------------------
| book1  | book2  | c11 | c10 | c01 | sim  |
============================================
| :book1 | :book1 | 3   | 0   | 0   | 1.0  |
| :book1 | :book2 | 2   | 1   | 1   | 0.5  |
| :book1 | :book3 | 0   | 3   | 2   | 0.0  |
| :book2 | :book1 | 2   | 1   | 1   | 0.5  |
| :book2 | :book2 | 3   | 0   | 0   | 1.0  |
| :book2 | :book3 | 1   | 2   | 1   | 0.25 |
| :book3 | :book1 | 0   | 2   | 3   | 0.0  |
| :book3 | :book2 | 1   | 1   | 2   | 0.25 |
| :book3 | :book3 | 2   | 0   | 0   | 1.0  |
--------------------------------------------

如果您不需要保留各种Cmn值,那么您可以优化它,例如,通过在最里面的查询中计算C01,在中间查询的下一个计算C10,但是然后而不是预测单独起来,产品只是它们的总和(C10 + C01),这样在你计算C11的最外层查询中,你可以做(​​C11 /(C11 +(C10 + C01)))。