我想从 RDF graphdatabse 查询那些在同一地点、同一日期或重叠日期旅行的人。我们有人员信息,包括旅行位置及其来源数据和今天。我在 SPARQL 中运行以下查询,它给出了正确的结果。
SPARQL 查询
SELECT DISTINCT ?p1 ?p2 ?o1 ?o2 ?loc ?fd1 ?td1 ?fd2 ?td2
WHERE {
?p1 ns:hasTravelledAt ?o1 .
?p2 ns:hasTravelledAt ?o2 .
?o1 ns:hasLocation ?loc .
?o2 ns:hasLocation ?loc .
?o1 ns:fromDate ?fd1 .
?o2 ns:fromDate ?fd2 .
?o1 ns:toDate ?td1 .
?o2 ns:toDate ?td2 .
FILTER ( (?p1 != ?p2 ) && ( (?fd1 <= ?fd2 && ?fd2 <= ?td1) || (?fd2 <= ?fd1 && ?fd1 <= ?td2) ) )
}
现在我想在 Prolog 中编写相同的查询,但是我遇到了 Filter 函数的问题,如何在 Prolog 查询中替换 Sparql Filter 函数:我正在尝试按如下方式运行查询:但没有得到结果:
(select-distinct (?p1 ?p2 ?o1 ?o2 ?loc ?fd1 ?td1 ?fd2 ?td2)
(q ?p1 !ns:hasTravelledAt ?o1)
(q ?p2 !ns:hasTravelledAt ?o2)
(q ?o1 !ns:hasLocation ?loc)
(q ?o2 !ns:hasLocation ?loc)
(q ?o1 !ns:fromDate ?fd1)
(q ?o2 !ns:fromDate ?fd2)
(q ?o1 !ns:toDate ?td1)
(q ?o2 !ns:toDate ?td2)
?- (or (and (?fd1 <= fd2) (?fd2 <= ?td1)) (and (?fd2 <= fd1) (?fd1 <= ?td2)) )
(not (= ?p1 ?p2))
)
谁能帮我?如何在序言查询中使用过滤器功能。谢谢