【问题标题】:do I use netbeans or Sparql in protege?我在 protege 中使用 netbeans 还是 Sparql?
【发布时间】:2013-07-19 18:31:42
【问题描述】:

我的项目中有一个问题。 我不知道我是否需要使用netbeans。 我的工作是关于推荐系统的图书馆书籍。作为输入,我需要书籍分类本体。在我的本体中对图书馆书籍进行分类。此分类有 14 个类别,除了兄弟类 Author、book、Isbn。 book 类的个人是 book 的主题(约 600 个主题),author 类的个人是 name 的作者,也是 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 小组都与她共享书籍。(你认为我是什么)

【问题讨论】:

  • 不太清楚你在问什么。您可以在不使用 Netbeans 的情况下使用 Protégé 和 SPARQL。如果我理解您对 X 和 Y 之间的相似性度量的要求,您可能可以在 SPARQL 中做到这一点,因为 SPARQL 包含一些数学运算。对于评估数学公式,有一个 answer 涉及评估序列上的一些公式,如果您需要进行一些棘手的操作,这可能会有所帮助。不过,您的情况可能更简单。
  • 我不知道您什么时候想使用 NetBeans。我自己倾向于使用 Eclipse,但有很多命令行工具可用于使用 SPARQL,所以说实话,我实际上可以在不使用任何 IDE 的情况下做很多事情。我添加了一个答案,展示了如何仅使用 SPARQL 查询(我使用 Jena 的命令行工具执行)来计算这些相似度指标。
  • 是的,我想计算 X 和 Y 之间的相似度。但我也将这个公式应用于所有书籍。例如 X 和 y ,又是 x 和 z ,又是 x 和 s ,,,,和 y 和 z ,...所以我不知道如何在 sparql 中实现成对计算。
  • 我发布的答案显示了如何使用 SPARQL 计算相似度。
  • 对不起,我不确定你在问什么。我相信正在计算的公式是您描述的公式;我不认为价值太高。你能澄清一下你的意思吗?

标签: sparql ontology protege


【解决方案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 册有第 3 册没有的 2 个主题,而第 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?book2sample(?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)))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多