SPARQL:查询完整列表

SPARQL:查询完整列表,sparql,Sparql,我有这样一个疑问: CONSTRUCT { ?p a :IndContainer . ?p :contains ?ind . } WHERE{ :ClassContainer_1 :contains ?class . ?ind a ?class . BIND (IRI(...) AS ?p) . } 单个ClassContainer_1与某些类相关。我得到这些课程,并试图找到这些课程的个人。然后我尝试创建一个IndContainer,它应该存储找到的

我有这样一个疑问:

 CONSTRUCT {
    ?p a :IndContainer .
    ?p :contains ?ind .
} WHERE{
    :ClassContainer_1  :contains ?class .
    ?ind a ?class .
    BIND (IRI(...) AS ?p) .
}
单个
ClassContainer_1
与某些类相关。我得到这些课程,并试图找到这些课程的个人。然后我尝试创建一个
IndContainer
,它应该存储找到的个体(点仅用于简化)。因此,我想:

  • 仅当找到类的所有绑定的个体时,才创建容器的个体
  • 为来自
    ?ind
    的所有可能的个体集创建
    IndContainer
    的个体(即,当一些
    ?类
    具有多个个体时)
  • 可以创建这样的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
    individual。

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

    @前缀:。
    :容器a:ClassContainer;
    :包含:A,:B。
    :wa:a.#安:A
    :xa:a.#另一个:A
    :y a:B.#a:B
    :za:a,:B.#A:A和A:B都有
    
    您的查询已经非常接近了。下面是一个有效的方法及其结果:

    前缀:
    构造{
    ?INDA容器:INDC容器;
    :包含?ind。
    }
    在哪里{
    :容器a:ClassContainer;
    :包含?类。
    找一个班。
    绑定(IRI(concat(str(?class),“-container”))为?indContainer)
    }
    
    @前缀:。
    :B-容器a:IndContainer;
    :包含:y,:z。
    :A-容器A:IndContainer;
    :包含:w,:x,:z。
    
    能否显示您拥有的数据和希望构造查询返回的数据的示例。你想要什么还不太清楚。不过,我认为可以使用SPARQL。为正面和负面案例添加插图。只需注意,如果您在评论中添加“@”,此人将收到通知。我没有得到关于你评论的警告,但如果你在其中包含“@JoshuaTaylor”,我会得到警告。这两个容器的标准是什么?为什么容器1包含“1_2”和“2_1”,而容器2包含“1_2”和“2_1”?容器2应该只包含“2_1”吗?似乎每个类只有一个容器;“是吗?”乔舒阿泰勒感谢你的回复和建议。我的英语不好,这就是我可能误导别人的原因。我试图通过添加更一般的解释来澄清。所以你对问题的理解和我的不一致。在这种情况下,我们应该有6种组合:{w,y},{w,z},{x,y},{x,z},{z,y},{z,z}。虽然我不考虑多重继承的情况。但是,给出了类X、Y和Z的列表,你正在寻找笛卡尔积X x y x z的所有成员。例如,如果列表是狗,猫,其中狗= {D1,D2}和CAT= {C1,C2,C3},你想要6个容器,对吗?你想要这些:{d1,c1},{d1,c2},{d1,c3},{d2,c1},{d2,c2},{d2,c3}?这将更加困难;我不确定这是否可能是的,是的。恐怕有必要使用一些推理机。我认为BasVor和SWI PROlog是一个变体。无论如何,谢谢您的关注。@user1576003推理机听起来真是太过分了。无论您使用哪种语言,难道您不能使用SPARQL查询收回类中的个人列表,并使用该编程语言构造笛卡尔积吗?然后您还可以选择按需计算它们,而不是在SPARQL结果中传输大型笛卡尔积。是的,我可以。我只是觉得我错过了SPARQL的一些东西,这些东西可以帮助我简化决策。谢谢
    @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:> .
    
    :B-container  a    :IndContainer ;
            :contains  :y , :z .
    
    :A-container  a    :IndContainer ;
            :contains  :w , :x , :z .