SPARQL:查询完整列表

时间:2015-11-30 20:22:05

标签: sparql

我有这样的疑问:

 CONSTRUCT {
    ?p a :IndContainer .
    ?p :contains ?ind .
} WHERE{
    :ClassContainer_1  :contains ?class .
    ?ind a ?class .
    BIND (IRI(...) AS ?p) .
}

个人ClassContainer_1与某些课程有关。我得到这些课程,并试图找到这些课程的个人。然后我尝试创建一个IndContainer来存储找到的个体(点仅用于简化)。所以,我想:

  1. 仅在找到IndContainer所有绑定的个人时才创建?class的个人;
  2. 为来自IndContainer的所有可能的个人组创建?ind的个人(即当?class中的某些人拥有一群个人时)。
  3. 是否可以创建这样的SPARQL查询?或者有必要使用一些规则引擎吗?

    编辑(添加插图): 积极的例子。有:

    test:ClassContainer_1
      rdf:type test:ClassContainer ;
      test:contains test:Type1 ;
      test:contains test:Type2 ;
    .
    test:Type1_1
      rdf:type test:Type1 ;
    .
    test:Type1_2
      rdf:type test:Type1 ;
    .
    test:Type2_1
      rdf:type test:Type2 ;
    .
    

    想要收到:

    test:IndContainer_1
      rdf:type test:IndContainer ;
      test:contains test:Type1_1 ;
      test:contains test:Type2_1 ;
    .
    test:IndContainer_2
      rdf:type test:IndContainer ;
      test:contains test:Type1_2 ;
      test:contains test:Type2_1 ;
    .
    

    否定示例:与积极相同,但没有班级Type2的个人,因此不应生成IndContainer个人。

    编辑2(问题本质): 我们可以从组合构成的角度来看待这个问题。我们在每个组合中有两个位置(在我的例子中)。职位数由每个ClassContainer所依赖的班级数决定。每个职位必须填写一个与该职位相对应的一个人。所以在我的例子中,第一个位置必须填充一个Type1类的个体,第二个 - Type2类(但顺序无关紧要)。第一堂课有两个人,第二堂课有一个人。为了得到组合的数量,我们可以使用组合学的产品规则 - 2 * 1 = 2,即{Type1_1,Type2_1} - 是第一个组合,{Type1_2,Type2_1} - 是第二个组合。对于每种组合,都需要生成IndContainer个人。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您需要一个“容器”,该容器包含在包含属于该类的个人的“类容器”中。只要您可以从类的IRI构造容器的IRI,这并不难做到。这里有一些样本数据,包括两个类,A和B,以及一些实例(一些只是A,一些只是B,一些是A和B):

@prefix : <urn:ex:> .

:container a :ClassContainer ;
           :contains :A, :B .

:w a :A .       # an :A
:x a :A .       # another :A
:y a :B .       # a :B
:z a :A, :B .   # both an :A and a :B

您的查询已经非常接近了。这是一个有效的,以及它的结果:

prefix : <urn:ex:>

construct {
  ?indContainer a :IndContainer ;
                :contains ?ind .
}
where {
  :container a :ClassContainer ;
             :contains ?class .
  ?ind a ?class .
  bind(IRI(concat(str(?class),"-container")) as ?indContainer)
}
@prefix :      <urn:ex:> .

:B-container  a    :IndContainer ;
        :contains  :y , :z .

:A-container  a    :IndContainer ;
        :contains  :w , :x , :z .