SPARQL中的非标量文字和查询

时间:2017-11-14 19:31:32

标签: sparql rdf semantic-web rdfs

假设此处的运行时上下文是Apache jena 3.4和ARQ查询引擎。 考虑以下三元组:

:lib1  :makes   "Butter"
:lib2  :makes   "Bread"

以各种方式直接询问:makeslib1的{​​{1}}属性,并返回文字字符串。太好了。 但是,我希望将一组其他属性外部管理为散列映射,例如(这不是合法的RDF):

lib2

这是因为我想将attrs分组在支持jena运行时的persistor中,而不是爆炸到这个:

:lib1  :attrs   {a:1, b:"hello", c:false}

或:

:lib1  :attrs_a  1
:lib1  :attrs_b  "hello"
:lib1  :attrs_c  false

我当然可以对来自缓冲器的数据进行一些额外的操作。我想到的是:lib1 :attrs::a 1 :lib1 :attrs::b "hello" :lib1 :attrs::c false

subProperty

以后

:attrs   rdf:type   rdf:Property
:a       rdfs:subPropertyOf  :attrs
:b       rdfs:subPropertyOf  :attrs
:c       rdfs:subPropertyOf  :attrs

可用于动态获取所有subProperties。这有效,虽然在查询中也返回“父”属性?resolveSubject ?p ?resolveObject . ?p rdfs:subPropertyOf+ :attrs ,这有点令人恼火;我希望看到没有FILTER或其他类似的东西。

问题:在处理这种分组的动态数据方面是否还有其他最佳做法/实用提示+技巧?或者它很快归结为如何将它们变成子属性?

1 个答案:

答案 0 :(得分:3)

{a:1, b:"hello", c:false}这样的地图不是一个特别复杂的结构,而且很容易在RDF中表示。它是一个具有三个条目的对象,每个条目将一个键与一个值相关联。所以,近似

:lib1  :attrs   {a:1, b:"hello", c:false}

你可以这样做:

:lib1 :attrs [ :hasEntry [ :key "a"; :value 1 ] ,
                         [ :key "b"; :value "hello" ] ,
                         [ :key "c"; :value false ] ] .

当然,它看起来有点冗长,但你已经抓住了三元组的整体结构特别复杂,特别是如果你以编程方式发布这些结构。

这些也允许使用SPARQL进行相当简单的查询。例如,要求图书馆和他们的" c"属性,我们可以使用如下的查询:

select ?lib ?value {
  ?lib :attrs/:hasEntry [ :key "c"; :value ?value ]
}