我正在使用C-SPARQL,我想查询从流接收到的三元组。但是,在使用要匹配确切的字符串文字的查询时遇到了一个问题。我通常会在查询中得到结果(数据来自字符串),但是当我为文字字符串值添加完全匹配项时,我始终不会得到任何结果。好像没有找到匹配项。但是,如果我查看从流中收到的所有三元组,就会发现有一些条目与我的字符串文字匹配。
这是我的查询示例:
REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s]
WHERE {
?s person:name "Huber" .
}
我还尝试使用以下两个示例使用过滤器和正则表达式:
REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s]
WHERE {
?s person:name ?o FILTER ( ?o = "Huber" ) .
}
REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s]
WHERE {
?s person:name ?o FILTER (regex(?o, '^Huber$')) .
}
所有查询都没有给出任何结果,就像没有匹配项一样。
如果我只执行以下查询,则会得到很多名称为= Huber的结果:
REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s]
WHERE {
?s person:name ?o .
}
我不确定C-SPARQL是否支持SPARQL的所有功能。我在另一篇文章中读到,C-SPARQL不支持round()。由于精确字符串的匹配是一项基本功能,至少在我看来,我不确定是否可能做错了什么或是否错过了一些细节。 我在SPARQL中尝试了查询,查询了一个三元组,并且所有查询都能正常工作。
所以,我有点困惑为什么字符串匹配在C-SPARQL中不起作用。 有人有任何提示或建议吗?
编辑(有关我的数据外观的更多信息):
我尝试使用C-SPARQL查询的数据是来自Web流的JSON-LD条目。流是通过Triplewave创建和发布的。
这将是JSON-LD的一个小示例:
[
{
"@id": "http://Stream/d7e4e816-0931-42ce-a21a-cbfaa552855d",
"http://www.w3.org/ns/prov#generatedAtTime": [
{
"@value": "2018-11-14T07:08:45.182Z"
}
],
"@graph": [
{
"@id": "http://schema.org/Person#1234",
"http://schema.org/name": [
{
"@value": "Huber"
}
]
},
{
"@id": "http://schema.org/Job#1234",
"http://schema.org/title"": [
{
"@value": "Professor"
}
]
}
]
}
]
没有类型信息或任何语言标签。
为了使用C-SPARQL查询我的网络流,我实现了一个RdfStream,它通过websocket接收JSON-LD数据,并创建了图形中所有条目的RdfQuadruple,并将其放入RdfStream中。
RdfQuadruple的一个示例是:
http://schema.org/Person#1234 http://schema.org/name Huber .
答案 0 :(得分:2)
STR( value )
函数解决了我的问题。
我必须事先将值转换为字符串
因此以下查询有效:
REGISTER QUERY LogStream AS
PREFIX person: <http://vocab/Person#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?o
FROM STREAM <ws://localhost:8124/tw/stream> [RANGE 5s STEP 1s]
WHERE {
?s person:name ?o FILTER ( str(?o) = "Huber" ) .
}
谢谢您的建议。