使用SPARQL匹配属性集

使用SPARQL匹配属性集,sparql,rdf,fuseki,Sparql,Rdf,Fuseki,这个问题是关于使用带有SPARQL端点的三重存储(Fuseki 3.8.0)查找匹配的候选者和路径 匹配条件是候选对象的属性必须包含路径的所有要求。在下面的最小示例数据中,匹配项应该是candi_1withpath_1和candi_2withpath_2 @prefix : <http://example.com/app#> . :candi_1 a :candidate ; :attribute "A", "B", "C" . :candi_2 a :candida

这个问题是关于使用带有SPARQL端点的三重存储(Fuseki 3.8.0)查找匹配的
候选者
路径

匹配条件是
候选对象的
属性
必须包含
路径
的所有
要求
。在下面的最小示例数据中,匹配项应该是
candi_1
with
path_1
candi_2
with
path_2

@prefix : <http://example.com/app#> .

:candi_1
  a :candidate ;
  :attribute "A", "B", "C" .

:candi_2
  a :candidate ;
  :attribute "C", "D" .

:candi_3
  a :candidate ;
  :attribute "C", "E" .

:path_1
  a :path ;
  :requires "A", "C" .

:path_2
  a :path ;
  :requires "C", "D" .

一种双重否定:

前缀:
选择?cand?路径
在哪里{
?C和a:候选人。
路径a:路径。
筛选器不存在{
?路径:需要?属性。
筛选器不存在{
?cand:属性?属性。
}
}
}
上述查询的性能应该不是很好。还可以尝试以下方法:

前缀:
选择?cand?路径
{
{
选择(计数(?属性)作为?计数)?路径?C
{
?路径a:path;:需要?attr。
?C和a:候选;:属性?属性。
}按路径进行分组
} 
{
选择(计数(?属性)作为?计数?路径
{
?路径a:path;:需要?attr。
}按路径分组
}
}

但是,如果存在“空”候选项和路径,则后一个查询将不起作用。

如果使用类似SPARQL的Turtle表示数据,您几乎肯定会发现这更容易实现(和理解)。第二个查询统计
:path
:candidate
之间共享的
:attribute
的数量,然后统计
:path
:attribute
。我不太清楚这个函数如何将响应限制为仅匹配的计数。计数被要求为马赫数,因为两者都被分配到
?count
,对吗?@ColinGross,是的,它们是“连接的”,就像在常规的三重模式中一样。或者,可以编写类似于
过滤器(?path1=?path2)
的代码。
+------------+-------------+
| ?candidate | ?valid_path |
+------------+-------------+
| :candi1    | :path1      |
| :candi2    | :path2      |
+------------+-------------+