SPARQL使用rdf和tpl查询分层数据

SPARQL使用rdf和tpl查询分层数据,rdf,sparql,hierarchy,apache-jena,Rdf,Sparql,Hierarchy,Apache Jena,我对sparql查询有点陌生,在生成一个简单的数据集时遇到了很多麻烦。基本上这就是我要做的。鉴于以下数据结构: Data -Composition -ElementName:"A" -Value :"4" 我想输出如下内容 ----------------------- | elementName | Value | ===================== | "A" | "1" | | "B"

我对sparql查询有点陌生,在生成一个简单的数据集时遇到了很多麻烦。基本上这就是我要做的。鉴于以下数据结构:

 Data
     -Composition
           -ElementName:"A"
           -Value      :"4"
我想输出如下内容

----------------------- 
| elementName | Value |
 =====================
| "A"         | "1"   |
| "B"         | "2"   |
| "C"         | "3"   |
| "D"         | "4"   |
-----------------------
使用下面的代码

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX tpl: <http://www.example.com/1962c0ea39923156f8ef72fa44584f26e7c5ae20#>

SELECT ?elementNameValue ?valueValue
WHERE {
{
?s tpl:Data/tpl:composition/tpl:elementName ?o .
?o rdf:value ?elementNameValue .
}
UNION
 {
?s tpl:Data/tpl:composition/tpl:value ?o .
?o rdf:value ?valueValue .
}
} 
我做错了什么?资源方向也很有帮助。使用ApacheJena是您的首要资源

关于您的问题,根据您的查询,联合构造用于匹配备选方案,例如,
?elementNameValue
用于联合的第一个分支的解决方案,而
?valueValue
用于联合的第二个分支的解决方案

如果您正在查找与内部联接等效的内容(例如,同时匹配名称和值的结果),则删除并集可能是您的目标:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX tpl: <http://www.example.com/1962c0ea39923156f8ef72fa44584f26e7c5ae20#>

SELECT ?elementNameValue ?valueValue WHERE {
  ?s tpl:Data/tpl:composition/tpl:elementName ?name .
  ?name rdf:value ?elementNameValue .
  ?s tpl:Data/tpl:composition/tpl:value ?value .
  ?value rdf:value ?valueValue .
} 
这将为您提供同时具有名称和值的结果行。另请参见Joshua Taylor的答案,了解使用空白节点变量的替代形式

相反,如果您需要与完全外部联接等效的内容(例如,具有值或名称或两者兼有的结果),则可以查看可选构造并相应地制定查询。所有内容都是简单明了的。

因为查询部分:

?s tpl:Data/tpl:composition/tpl:elementName?o。
?o rdf:值?元素名称值。

?s第三方物流:数据/第三方物流:成分/第三方物流:价值?o。
o rdf:值?值值。
在获取您要查找的部件时,我认为您可以使用这样的查询来获取您要查找的结果:

选择元素名称值{
?第三方物流:数据/第三方物流:组成?组成。
?组成tpl:elementName/rdf:value?elementName;
第三方物流:价值/rdf:价值?价值。
}
现在,您可以使用一个空白节点将其缩短一点:

选择元素名称值{
?s tpl:Data/tpl:composition[tpl:elementName/rdf:value?elementName。
第三方物流:价值/rdf:价值?价值]
}
但是,比这更好的是,你根本不需要这个角色。除非合成节点是tpl:Data的某个值的tpl:composition值这一点很重要,否则您可以直接从合成节点开始:

选择元素名称值{
[]tpl:elementName/rdf:value?elementName;
第三方物流:价值/rdf:价值?价值。
}

编写时会发生什么
选择?elementNameValue?valueValue WHERE{{{s tpl:Data/tpl:composition/tpl:elementName | tpl:value?o.?o rdf:value?elementNameValue。?o rdf:value?valueValue。}
假设smarty语法正确,我不熟悉“只是好奇,你指的是哪一部分?
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX tpl: <http://www.example.com/1962c0ea39923156f8ef72fa44584f26e7c5ae20#>

SELECT ?elementNameValue ?valueValue WHERE {
  ?s tpl:Data/tpl:composition/tpl:elementName ?name .
  ?name rdf:value ?elementNameValue .
  ?s tpl:Data/tpl:composition/tpl:value ?value .
  ?value rdf:value ?valueValue .
} 
SELECT ?elementNameValue ?valueValue WHERE {
  ?s tpl:Data/tpl:composition ?o .
  ?o tpl:elementName/rdf:value ?elementNameValue;
     tpl:value/rdf:value ?valueValue . 
}