2

我正在使用 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$')) .
}

没有一个查询给我任何结果,就好像没有匹配一样。

如果我只是执行以下查询,我会得到很多 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 .
}

我不确定 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查询我的 web 流,我实现了一个 RdfStream,它通过 websocket 接收 JSON-LD 数据,并在我的图中创建了所有条目的 RdfQuadruple 并将其放入 RdfStream。

RdfQuadruple 的一个例子是:

http://schema.org/Person#1234 http://schema.org/name Huber . 
4

1 回答 1

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" ) .
}

谢谢你的建议。

于 2018-11-11T17:06:58.420 回答