确保word-1紧接在word-2之前

时间:2014-10-16 05:52:31

标签: sparql

我有一个短语,我分为单词。每个单词都有一个ex:position属性,在下面的短语中标记其顺序:

 "Jack is painting and Mary is helping him"

 ex:phrase     ex:hasWord    ex:word-1 .
 ex:word-1     ex:label "Jack" .
 ex:word-1     ex:position "1"^^double .

 ex:phrase     ex:hasWord    ex:word-2 .
 ex:word-2     ex:label "is" .
 ex:word-2     :position "2"^^double .

 …

如何进行确保ex:word-1ex:word-2之前的查询。

      PREFIX ex: <http://www.w3.org/namespace/>
      select ?word1 ?word2
    {
      ?word1  ex:label ?label1 .
      ?word2  ex:label ?label2 .
    }

要限制ex:word-1ex:word-2之间的距离,我尝试了

FILTER(ex:position(?position1, ?position2) < 2) 

但我明白了:

  

未定义URI函数{position}。

1 个答案:

答案 0 :(得分:1)

我觉得你差不多了。以下查询将检索文本中给定文本之前的所有单词。第一个过滤器类似于您尝试的过滤器(单词2的位置减去单词1的位置<2),但差异应该是正数(因此过滤器中的第二个条件):

PREFIX ex: <http://www.w3.org/namespace/>
      select ?word1 ?word2
    {
      ?word1  ex:label ?label1 .
      ?word1  ex:position ?p1 .
      ?word2  ex:label "label of the word you want" .
      ?word2  ex:position ?p2 .
      FILTER(((?p2 - ?p1)<2) && (?p2>?p1))
    }

我一直在Twinkle做一些测试,并且还允许以下内容:

FILTER((?p2 - ?p1)=1) 

简化了一切。 最后,既然你似乎在控制rdf中的断言,你为什么不创建一个“ex:precedes”关系呢?这样你就可以通过以下方式获得答案:

select ?word1 ?word2
    {
      ?word1  ex:precedes ?word2 .
      ?word2  ex:label "your label" .
    }