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
的个体(即,当一些?类
具有多个个体时)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 .