Sparql 如何返回实体id的并集';s

Sparql 如何返回实体id的并集';s,sparql,Sparql,考虑制定一份人员(家长)及其职位(子女)的清单 注意,我已经简化了这个示例,但它可以是child等的父-子childofChild,因此有些实体具有子树 我希望有一个查询,返回一些经过筛选(根据某些条件)的人员id和他们的帖子id的联合,如下所示: person1Id person2Id person1Post1Id person1Post2Id ....... 考虑到一个具体情况,有3个人(有财产、年龄、姓名),其中1人有2个职位,其他人没有职位,我设法通过两种方式做到这一点,但两者都有局限

考虑制定一份人员(家长)及其职位(子女)的清单

注意,我已经简化了这个示例,但它可以是child等的父-子childofChild,因此有些实体具有子树

我希望有一个查询,返回一些经过筛选(根据某些条件)的人员id和他们的帖子id的联合,如下所示:

person1Id
person2Id
person1Post1Id
person1Post2Id
.......
考虑到一个具体情况,有3个人(有财产、年龄、姓名),其中1人有2个职位,其他人没有职位,我设法通过两种方式做到这一点,但两者都有局限性。在where条款中,我们有:

 ?entityId ?p ?o.
 {
    #persons/posts graph pattern
 } 
 filter (?entityId =?person || ?entityId=?post) # || otherChildFitler
这是可行的,但使用了过滤器,因此我希望通过使用union来避免:

    {
            SELECT (?person as ?s) WHERE{ #criteria}
            order by ...
            limit 1
    }
    UNION
    {
            {
                    SELECT ?person WHERE{ #criteria}
                    order by ...
                    limit 1
            }
            ?s a <http://www.example.org/schema/Post> .
            ?s  <http://www.example.org/schema/postedBy> ?person .
    }
在sparql1.1文档中,“BIND子句引入的变量在BIND中使用之前不得在group graph模式中使用。”但每次引入一个新变量时,我认为它应该可以工作


因此,如何在不重复子查询或使用筛选器的情况下解决此问题。

如果提供一些数据,回答此类问题会容易得多。如果我没弄错你的问题,你有如下数据。我以海龟的形式提供它,因为它相当容易让人阅读

@prefix : <http://stackoverflow.com/q/21115947/1281433/> .

# person1 has two posts, person2 has one post, and 
# person3 has no posts at all.

:person1 a :Person ;
         :hasPost :person1post1 , :person1post2 .

:person2 a :Person ;
         :hasPost :person2post1 .

:person3 a :Person .
这里的技巧是在查询模式中

  ?person a :Person ;    
          :hasPost? ?id .
?person a:person
确保
?person
是一个人。然后,模式
?person:hasPost?id
查找
?id
s,这样就有一条从
?person
?id
的路径,长度为零或一。长度为零的情况意味着
?id
可以绑定到
?person
的相同值。长度为1的情况意味着您将获得每个
x
,这样
?person:hasPost x

现在,对于person和post,谈论post有其他post没有多大意义(我认为),但是如果您只是在树结构中寻找后代,您可以在属性路径中使用
*
而不是
。例如,如果您有以下数据:

@prefix : <http://stackoverflow.com/q/21115947/1281433/> .

#      1
#     / \
#    /   \
#   2     3
#  / \   / \
# 4   5 6   7
#  \     \   \
#   8     9   10 

:node1 :hasChild :node2 , :node3 .
:node2 :hasChild :node4 , :node5 .
:node3 :hasChild :node6 , :node7 .
:node4 :hasChild :node8 .
:node6 :hasChild :node9 .
:node7 :hasChild :node10 .

我不太清楚你想做什么,主要是因为我还没有看到你正在处理的数据。你只是想把人和帖子作为单一变量的结果吗?
prefix : <http://stackoverflow.com/q/21115947/1281433/>

select ?id where {
  ?person a :Person ;    
          :hasPost? ?id .
}
-----------------
| id            |
=================
| :person3      |
| :person2      |
| :person2post1 |
| :person1      |
| :person1post2 |
| :person1post1 |
-----------------
  ?person a :Person ;    
          :hasPost? ?id .
@prefix : <http://stackoverflow.com/q/21115947/1281433/> .

#      1
#     / \
#    /   \
#   2     3
#  / \   / \
# 4   5 6   7
#  \     \   \
#   8     9   10 

:node1 :hasChild :node2 , :node3 .
:node2 :hasChild :node4 , :node5 .
:node3 :hasChild :node6 , :node7 .
:node4 :hasChild :node8 .
:node6 :hasChild :node9 .
:node7 :hasChild :node10 .
prefix : <http://stackoverflow.com/q/21115947/1281433/>

select ?node where {
  :node3 :hasChild* ?node
}
-----------
| node    |
===========
| :node3  |
| :node7  |
| :node10 |
| :node6  |
| :node9  |
-----------