Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rdf SPARQL在同一筛选器中查询多个ORs_Rdf_Sparql_Semantic Web_Ontology_Protege - Fatal编程技术网

Rdf SPARQL在同一筛选器中查询多个ORs

Rdf SPARQL在同一筛选器中查询多个ORs,rdf,sparql,semantic-web,ontology,protege,Rdf,Sparql,Semantic Web,Ontology,Protege,好吧,假设我有5个数据类型属性,它们的值是整数。这些属性被断言为属于“WWS”类的个人。这个班有4个人。但这些个体中只存在一些数据类型属性。 如何查询此类中满足值5的个体。我希望变量只显示那些属性满足的个体,其余的不应该出现 我希望这是更清楚 谢谢大家! 数据: datatype properties (range:integers): #greaterthantoc #lessthantoc #lowerlimtoc #upperlimtoc #equalstoc individuals:

好吧,假设我有5个数据类型属性,它们的值是整数。这些属性被断言为属于“WWS”类的个人。这个班有4个人。但这些个体中只存在一些数据类型属性。 如何查询此类中满足值5的个体。我希望变量只显示那些属性满足的个体,其余的不应该出现

我希望这是更清楚

谢谢大家!

数据:

datatype properties (range:integers): #greaterthantoc #lessthantoc #lowerlimtoc #upperlimtoc #equalstoc

individuals: #ww1, #ww2, #ww3 , #ww4 belong to class #WWS

#ww1 has #greaterthantoc "0"^^xsd:integer
#ww2 has #lessthantoc "5"^^xsd:integer
#ww3 has #greaterthantoc "5"^^xsd:integer
#ww4 has #lowerlimtoc "9"^^xsd:integer and #upperlimtoc "10"^^xsd:integer

Conditions for each property (filter?):
#greaterthantoc <= "a number" 
#lessthantoc >= "a number" 
#lowerlimtoc <= "a number" && #upperlimtoc >= "a number"
#equalstoc = "a number"
数据类型属性(范围:整数):#greaterthantoc#lessthantoc#lowerlimtoc#upperlimtoc#equalstoc
个人:#ww1、#ww2、#ww3、#ww4属于类#WWS
#ww1有#个大于TOC“0”^^xsd:integer
#第二次世界大战有#lessthantoc“5”^^xsd:integer
#第三次世界大战有#更大的TOC“5”^^xsd:integer
#ww4有#lowerlimtoc“9”^^xsd:integer和#upperlimtoc“10”^^xsd:integer
每个属性(过滤器?)的条件:
#greaterthantoc=“一个数字”
#lowerlimtoc=“一个数字”
#equalstoc=“一个数字”
结果应该是满足这些条件的WWS个体。例如,当数字为4时,结果应为WW1和WW2

我怀疑我的案例需要这样的东西,但它仍然不会返回结果:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ww:<#>


SELECT ?str

WHERE {?str rdf:type ww:WWS  .

OPTIONAL { ?str ww:greaterthantoc ?gr; ww:lessthantoc ?les ; ww:lowerlimtoc ?low ; ww:upperlimtoc ?up  ; ww:equalstoc ?eq  . } 

FILTER ( ?les >= 3 || ?gr <= 3 || (?low <= 3 && ?up >=3)  || ?eq = 3) 

  } 
前缀rdf:
前缀owl:
前缀xsd:
前缀rdfs:
前缀ww:
选择?str
其中{?str rdf:type ww:WWS。
可选{str ww:greaterthantoc?gr;ww:lessthantoc?les;ww:lowerlimtoc?low;ww:upperlimtoc?up;ww:equalstoc?eq.}

过滤器(?les>=3 | |?gr您尚未显示数据,并且您的查询以奇怪的方式更改(例如,使用不同的URI作为
ww:
前缀),因此很难说您提供的任何查询实际返回了什么。但是,在SPARQL筛选器中,可以使用多个带有
|
的条件

当个体具有所有属性的值时 使用
构造,我们可以在查询中提供一些数据,并查看多路
|
的工作原理:

prefix : <http://stackoverflow.com/q/23561351/1281433/>

select ?s where { 
  values (?s ?gr ?les ?eq ?low ?up) {
    (:s1 3 0 0 0 0)
    (:s2 0 3 0 0 0)
    (:s3 0 0 3 0 0)
    (:s4 0 0 0 3 0)
    (:s5 0 0 0 0 3)
    (:s6 0 0 0 0 0)
    (:s7 1 1 1 1 1)
  }

  filter ( ?eq > 2 || ?les > 2 || ?gr > 2 || ?low > 2 || ?up > 2 )
}
如果条件相同 在上面的示例中,与问题的原始版本一样,每个变量的约束都是相同的。如果是这种情况,您可以通过使用析取属性路径或使用
值来缩短此查询。使用析取属性路径,您可以写:

select ?s where { 
  ?s :prop1|:prop2|:prop3|:prop4 ?value 
  filter ( ?value > 2 )
}
select ?s where { 
  values ?prop { :prop1 :prop2 :prop3 :prop4 }
  ?s ?prop ?value 
  filter ( ?value > 2 )
}
使用值,您可以编写:

select ?s where { 
  ?s :prop1|:prop2|:prop3|:prop4 ?value 
  filter ( ?value > 2 )
}
select ?s where { 
  values ?prop { :prop1 :prop2 :prop3 :prop4 }
  ?s ?prop ?value 
  filter ( ?value > 2 )
}
由于您提到了与
可选的
的交互,请注意,每种方法都有一个优点,即
?s
不必为所有属性定义值,但是如果
?s
的任何指定属性的值都大于2,您就可以找到它。在一些原始查询中,其中你有类似于

?s :prop1 ?value1 ;
   :prop2 ?value2 ;
   :prop3 ?value3 .
对于具有值为
:prop1
和值为
:prop2
以及值为
:prop3
的资源,您只能获得
?s
的绑定

当个体不为所有属性赋值时 如果个人没有所有属性的值,事情会变得有点棘手,因为您需要选择性地匹配这些值,因为有些值不会出现。但这并不难。只需将可能不存在的部分放在
optional
块中:

select ?s where { 

  ?s a :desiredType .
  optional { ?s :prop1 ?value1 }
  optional { ?s :prop2 ?value2 }
  optional { ?s :prop3 ?value3 }

  filter ( ?value1 > 2 || ?value2 < 5 || ?value3 = 42 )
}
选择?s,其中{
?SA:所需类型。
可选{s:prop1?value1}
可选{s:prop2?value2}
可选{s:prop3?value3}
过滤器(?value1>2 | |?value2<5 | |?value3=42)
}

您可以在一个筛选器中使用两个以上的条件。但是,除非您也共享您的数据,否则我们无法确定其中任何一个条件应该返回什么。但是,在差异示例中,您使用不同的URI作为前缀
ww:
,这是一个很大的危险信号。在编辑之前,这个问题可能会因为以下原因而关闭:“此问题似乎与主题无关,因为它缺少足够的信息来诊断问题。请更详细地描述您的问题,或在问题本身中包含一个最小的示例。@JoshuaTaylor我更新了主题。现在更清楚了吗?事实上,你从问题中删除了很多内容,我认为这改变了上下文。在你最初的帖子中,你有
过滤器(…|…| |…)
,意思是“保留满足x或y或z的解决方案”现在你有了
filter…filter…filter…
,意思是“保留满足x、y和z的解决方案”,这是非常不同的。您需要显示您试图实现的数据和结果,但您还没有这样做。但是更新添加了什么,我认为这很重要,不是每个人都有每个属性的值。这意味着您需要一些可选的匹配。这不太难。我将更新my回答…@JoshuaTaylor不知道几个过滤器的意思是“和…和”.因此| |对于我的情况是正确的。是的,不是每个人都有每个属性的值。这就是为什么当我将它们作为单个查询时,它会返回结果,但当我在同一查询中尝试多个时,它不会响应。我将使用数据和所需结果更新帖子。问题是,对于某些属性,我需要它们为例如2或=2.所以我想我需要不同的过滤器。事实上,所选变量不必包含所有这些属性。只要它满足其中一个属性,就应该“打印”.好的,所以真正的查询不能被很好地压缩。即使如此,第一个查询,有明确的多个条件,可以工作,对吗?正如你所说的,并不是所有的个体都有断言的所有属性。所以它在这种情况下并不真正工作。另外,合并结果有点复杂(类的个体:满足不同属性条件的WWS)在同一个变量中。@user3211165是的,我现在明白了,但是您最初的示例没有显示值有不同的条件,所以看起来像