我如何递归地跟随空白节点以获得关于对象的所有三元组?

How do I recursively follow blank nodes to get all triples about an object?

这是 ID 为 123 的用户的数据对象,该用户年龄 50 岁,喜欢意大利面。

[ a :user;
 :user_id 123;
 :demographics [ :age 50 ];
 :favorite_food [ :italian [ :spaghetti true ]]
].

是否有任何 sparql 查询,我可以在其中获取与该用户相关的所有三元组,而不必为每个可能的空白节点值执行 UNION?

我正在尝试将 json 转换为三元组,然后将三元组转换回 json, 因此,无需向 json.

的每个子元素添加父 ID 属性 即可查询嵌套深度未知的对象将非常方便

这似乎可行,但我必须为每一层嵌套执行 UNION

select ?e1 ?a1 ?v1 { ?e :user_id 123.
{ ?e ?a1 ?v1. BIND(?e AS ?e1) }
UNION { ?e ?a ?v. ?v ?a1 ?v1. BIND(?v AS ?e1). } }

UninformedUser 指出了一个解决方案。从查询的外观来看,递归 属性 路径技巧似乎不会在嵌套之前获取第一层,但它确实获取了所有数据。

select ?s ?p ?o { ?e :user_id 123. ?e (<>|!<>)* ?s. ?s ?p ?o }

@UninformedUser 在评论中提供了解决方案。尽管 OP 认为使用递归 属性 路径技巧的查询不会在嵌套之前获取第一级,但它确实获取了所有他们想要的数据。

SELECT ?s ?p ?o 
  { ?e  :user_id   123 . 
    ?e  (<>|!<>)*  ?s  . 
    ?s  ?p         ?o 
  }