C-SPARQL查询-匹配确切的字符串文字

时间:2018-11-11 12:45:08

标签: stream sparql rdf semantic-web triples

我正在使用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 . 

1 个答案:

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

谢谢您的建议。