gpt4 book ai didi

rdf - 使用变量与 IRI 的奇怪 SPARQL 行为

转载 作者:行者123 更新时间:2023-12-02 03:34:14 25 4
gpt4 key购买 nike

我在使用 Allegrograph 4.13 时遇到了奇怪的行为

这是测试用例的数据

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

INSERT DATA {
:A rdfs:label "A" .
:A :hasProp :Prop1 .
:Prop1 :Key "1" .
:Prop1 :Value "AA" .

:B :hasProp :Prop2 .
:Prop2 :Key "1" .
:Prop2 :Value "AA" .

:C :hasProp :Prop3 .
:C :hasProp :Prop4 .
:Prop3 :Key "1" .
:Prop3 :Value "AA" .

:Prop4 :Key "2" .
:Prop4 :Value "BB" .
}

鉴于:A,我需要找到具有完全相同属性的资源。
也就是说,我想找到 :B 而不是 :C,因为 :C 还有一个属性(键“2”和值“BB”)

另见此问题 Find individuals in SPARQL based on other relations / Compare sets

以下查询由 Joshua Taylor友情提供直接使用资源(:A)并完全按照我的要求执行:
prefix : <http://example.com/example#> 

select ?other ?k ?v {
:A :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
filter not exists {
{ :A :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { :A :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}

回答:
 -------------------  
|other| k | v
|A | "1" | "AA"
|B | "1" | "AA"
-------------------

第二个是使用变量 ?a,因为我需要根据某些标准首先找到 :A(在本例中为 rdfs:label)

使用变量 ?a 查询:
 prefix : <http://example.com/example#> 

select ?other ?k ?v {
?a rdfs:label "A" .
?a :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
filter not exists {
{ ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}

返回
 -------------------  
|other| k | v
|A | "1" | "AA"
|B | "1" | "AA"
|C | "1" | "AA"
-------------------

此查询还返回 :C 在我看来这是错误的。

任何人都可以解释这种行为或用其他三元组存储/SPARQL 引擎验证这个测试用例吗?

附加测试

根据评论中的要求,我为 rdfs 添加了前缀,并用变量替换了空白节点。这似乎没有效果。
prefix : <http://example.com/example#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?a ?pr1 ?pr2 ?other ?k ?v {
?a rdfs:label "A" .
# bind (:A as ?a) .
?a :hasProp ?pr1 .
?pr1 :Key ?k ; :Value ?v .
?other :hasProp ?pr2 .
?pr2 :Key ?k ; :Value ?v .

filter not exists {
{ ?a :hasProp ?pp1 .
?pp1 :Key ?kk ; :Value ?vv .
filter not exists { ?other :hasProp ?pp2 .
?pp2 :Key ?kk ; :Value ?vv .
}
}
union
{
?other :hasProp ?pp3 .
?pp3 :Key ?kk ; :Value ?vv .
filter not exists { ?a :hasProp ?pp4 .
?pp4 :Key ?kk ; :Value ?vv .
}
}
}
}
a    pr1     pr2   other k       v  
A Prop1 Prop1 A "1" "AA"
A Prop1 Prop2 B "1" "AA"
A Prop1 Prop3 C "1" "AA"

如果我使用 BIND(注释)而不是带有 rdfs:label 的行,它看起来是一样的。

最佳答案

我认为您在 AllegroGraph 中发现了一个错误。似乎添加了 ? a rdfs:标签“A”应该限制​​ 的值?a 成为 :A ,这就是我们在 Jena 身上看到的行为。

Jena:       VERSION: 2.11.0
Jena: BUILD_DATE: 2013-09-12T10:49:49+0100
ARQ: VERSION: 2.11.0
ARQ: BUILD_DATE: 2013-09-12T10:49:49+0100
RIOT: VERSION: 2.11.0
RIOT: BUILD_DATE: 2013-09-12T10:49:49+0100

prefix : <http://example.com/example#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?other ?k ?v {
?a rdfs:label "A" .
?a :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
filter not exists {
{ ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}

----------------------
| other | k | v |
======================
| :B | "1" | "AA" |
| :A | "1" | "AA" |
----------------------

提出重现此行为的最小示例并提交错误报告可能是有意义的。

关于rdf - 使用变量与 IRI 的奇怪 SPARQL 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com