我有这样的疑问:
CONSTRUCT {
?p a :IndContainer .
?p :contains ?ind .
} WHERE{
:ClassContainer_1 :contains ?class .
?ind a ?class .
BIND (IRI(...) AS ?p) .
}
个人ClassContainer_1
与某些课程有关。我得到这些课程,并试图找到这些课程的个人。然后我尝试创建一个IndContainer
来存储找到的个体(点仅用于简化)。所以,我想:
IndContainer
所有绑定的个人时才创建?class
的个人; IndContainer
的所有可能的个人组创建?ind
的个人(即当?class
中的某些人拥有一群个人时)。是否可以创建这样的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
个人。
答案 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 .