我对Sparql查询有点问题。我想让所有主题都具有“TopologicalNode”类型,带有一个名为“BaseVoltage”的谓词和一个特定的资源(在这个例子中,'#_aa9')
有一个我的.xml样本
<cim:TopologicalNode rdf:ID="_f4d">
<cim:IdentifiedObject.name>dj</cim:IdentifiedObject.name>
<cim:TopologicalNode.BaseVoltage rdf:resource="#_2a9"/>
</cim:TopologicalNode>
<cim:TopologicalNode rdf:ID="_738">
<cim:IdentifiedObject.name>iT</cim:IdentifiedObject.name>
<cim:TopologicalNode.BaseVoltage rdf:resource="#_a5c"/>
</cim:TopologicalNode>
<cim:TopologicalNode>
<cim:TopologicalNode rdf:ID="_2a2">
<cim:IdentifiedObject.name>Hi</cim:IdentifiedObject.name>
<cim:TopologicalNode.BaseVoltage rdf:resource="#_2a9"/>
<cim:TopologicalNode.ConnectivityNodeContainer rdf:resource="#_d7a"/>
</cim:TopologicalNode>
我的查询不起作用(遇到一个终止三重模式的令牌,但有太多令牌才能形成有效的三重模式)
"SELECT ?s WHERE {?s rdf:type cim:TopologicalNode; cim:TopologicalNode.BaseVoltage ?o rdf:resource '#_2a9';}"
我也尝试直接输入完整的URI ...同样的错误!
"SELECT ?s WHERE {?s rdf:type cim:TopologicalNode; cim:TopologicalNode.BaseVoltage ?o rdf:resource <example.org/EQ#_2a9>;}"
我的错误是什么?它必须在第三个区块,因为我看到这是有效的
"SELECT ?s WHERE {?s rdf:type cim:TopologicalNode; cim:TopologicalNode.BaseVoltage ?o }"
非常感谢!
答案 0 :(得分:2)
您的查询无效SPARQL,如果您包含一些空格,您可以轻松看到:
SELECT ?s
WHERE
{
?s rdf:type cim:TopologicalNode ;
cim:TopologicalNode.BaseVoltage ?o rdf:resource '#_2a9' ;
}
在?o
之后,您立即声明了另一个谓词和对象对,但未能包含任何额外的标点符号来分隔标记并指示新的三重模式,因此解析器很适合给您这个错误。当然,错误可能更有帮助,但这是一个单独的问题。
您可以通过插入其他分号字符来修复查询:
SELECT ?s
WHERE
{
?s rdf:type cim:TopologicalNode ;
cim:TopologicalNode.BaseVoltage ?o ;
rdf:resource '#_2a9' ;
}
顺便说一下,您仍然无法获得任何结果,因为rdf:resource
仅仅是RDF / XML的序列化细节,不会显示在您的数据中。你可能想要的只是使用URI代替?o
,如下所示:
SELECT ?s
WHERE
{
?s rdf:type cim:TopologicalNode ;
cim:TopologicalNode.BaseVoltage <http://example.org#_2a9> ;
}
当然,您可能仍需要稍微调整一下以使用正确的URI,但这应该指向正确的方向