Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Graph 如何在SPARQL中中断路径扩展?_Graph_Sparql_Rdf_Triplestore_Propertypath - Fatal编程技术网

Graph 如何在SPARQL中中断路径扩展?

Graph 如何在SPARQL中中断路径扩展?,graph,sparql,rdf,triplestore,propertypath,Graph,Sparql,Rdf,Triplestore,Propertypath,考虑到以下数据集,我正在尝试查找朋友的所有朋友,但一旦其中一个朋友(例如律师)是律师,就停止扩展路径 预期结果是: Ben, Lena, Grek, John, Bill, Peter 我现在做的是: SELECT ?friend WHERE { :BEN :knows+ ?friend. FILTER NOT EXISTS { ?friend ^:knows*/:profession :Lawyer} } 对于更大的数据集,这只是一种降低速度的方

考虑到以下数据集,我正在尝试查找朋友的所有朋友,但一旦其中一个朋友(例如律师)是律师,就停止扩展路径

预期结果是:

Ben, Lena, Grek, John, Bill, Peter
我现在做的是:

SELECT ?friend
WHERE {
       :BEN :knows+ ?friend. 
       FILTER NOT EXISTS { ?friend ^:knows*/:profession :Lawyer}
      }
对于更大的数据集,这只是一种降低速度的方法,实际上它在内存中保存了大量无关的数据

是否可以剪切路径扩展,而不是在之后过滤结果

谢谢

在SPARQL中,无法像这样“剪切”属性路径表达式

此外,我不认为您当前使用的查询符合您的要求。它将排除律师认识的任何人,无论律师是否在本的“知道”链接路径上。例如,如果Alice是一名律师,Alice认识Bill,那么Bill将不再包括在结果中。我认为这是对你所描述的更好的查询:

PREFIX : <http://example.org/>
SELECT ?friend WHERE {
    :Ben :knows+ ?friend.
    MINUS {
        :Ben :knows+ ?lawyer .
        ?lawyer :profession :Lawyer ; :knows* ?friend .
    }
}
前缀:
选择?朋友在哪里{
:本:知道+?朋友。
减去{
:本:知道吗?律师。
律师:职业:律师;认识*?朋友。
}
}
根据您使用的SPARQL系统的不同,使用
减号
而不是
过滤器不存在
也可能具有更好的性能。

在SPARQL中无法“剪切”这样的属性路径表达式

此外,我不认为您当前使用的查询符合您的要求。它将排除律师认识的任何人,无论律师是否在本的“知道”链接路径上。例如,如果Alice是一名律师,Alice认识Bill,那么Bill将不再包括在结果中。我认为这是对你所描述的更好的查询:

PREFIX : <http://example.org/>
SELECT ?friend WHERE {
    :Ben :knows+ ?friend.
    MINUS {
        :Ben :knows+ ?lawyer .
        ?lawyer :profession :Lawyer ; :knows* ?friend .
    }
}
前缀:
选择?朋友在哪里{
:本:知道+?朋友。
减去{
:本:知道吗?律师。
律师:职业:律师;认识*?朋友。
}
}

根据您使用的SPARQL系统,使用
减号
而不是
过滤器不存在
也可能有更好的性能。

感谢gregory-请澄清:那么有什么办法解决这个问题吗?AllegroGraph将Lisp作为母语,但其他语言呢?什么样的系统更喜欢减号而不是过滤?我的猜测是,几乎所有的系统都会比不存在的系统更有效地执行减号,但在多大程度上完全是一个实现细节,如果没有基准测试,很难猜测。至于“解决问题,”如果问题只是性能,我会尝试减号查询,看看它是如何工作的。您所追求的可能超出了查询性能的阈值。如果是这种情况,那么您的选择包括寻找具有不同性能特征的不同SPARQL系统,使用较低级别的API自己实现查询,或者使用不同的查询语言(也许像Gremlin这样的遍历语言更适合您的需要).谢谢格雷戈里-请澄清一下:有什么办法可以解决这个问题吗?AllegroGraph将Lisp作为母语,但其他语言呢?什么样的系统更喜欢减号而不是过滤?我的猜测是,几乎所有的系统都会比不存在的系统更有效地执行减号,但在多大程度上完全是一个实现细节,如果没有基准测试,很难猜测。至于“解决问题,”如果问题只是性能,我会尝试减号查询,看看它是如何工作的。您所追求的可能超出了查询性能的阈值。如果是这种情况,那么您的选择包括寻找具有不同性能特征的不同SPARQL系统,使用较低级别的API自己实现查询,或者使用不同的查询语言(也许像Gremlin这样的遍历语言更适合您的需要)。