SPARQL查询以查找不符合特定条件的结果

SPARQL查询以查找不符合特定条件的结果,sparql,stardog,Sparql,Stardog,我正在尝试编写一个SPARQL查询,它将返回一组患者标识符代码(?Crid),这些代码与特定的诊断代码(?ICD9)关联,并且没有与特定药物关联,并且在招募日期(?RecruptDate)之前有一个订购日期(?OrderDate)。我已经将OBIB本体合并到我的图中 以下是我到目前为止所做的(有点简化,为了可读性/敏感性,略去了图中的几个步骤): 选择DISTINCT?Crid在哪里 {?天哪!天哪。 #--带诊断返回CRID ?Crid obib:hasPart?ICD9。 ?ICD9 a o

我正在尝试编写一个SPARQL查询,它将返回一组患者标识符代码(?Crid),这些代码与特定的诊断代码(?ICD9)关联,并且没有与特定药物关联,并且在招募日期(?RecruptDate)之前有一个订购日期(?OrderDate)。我已经将OBIB本体合并到我的图中

以下是我到目前为止所做的(有点简化,为了可读性/敏感性,略去了图中的几个步骤):

选择DISTINCT?Crid在哪里
{?天哪!天哪。
#--带诊断返回CRID
?Crid obib:hasPart?ICD9。
?ICD9 a obib:诊断。
#--返回带有医疗处方记录的CRID
克里德·奥比布:哈斯帕特?医疗记录。
?医疗记录obib:医疗记录。
#--返回带有订单日期的CRID
?医疗记录obib:hasPart?订单日期。
?OrderDate a obib:dateOfDataEntry。
#--返回带有招聘日期的CRID
?Crid obib:hasPart?表单填充。
?表格填充obib:表格填充。
?招聘日期obib:isAbout?表格填写。
?招募日期a obib:数据输入的日期。
#--特定ICD9代码的过滤结果
过滤器(?ICD9='1')
#--招募前,减去特定药物和订单日期的结果
#--这是我认为给我带来问题的部分
减去{
过滤器(regex(?medRecord,“药物1”,“i”))
过滤器(?招聘日期-?订单日期<“P0D”^^xsd:dayTimeDuration)
}
}
我的直觉是我没有正确使用负号。这个查询返回的大部分结果都是正确的:我期望得到10个结果,而它返回的结果是12个。无关的2个结果确实使用了“药物治疗1”,并且在招募日期之前有订单日期,所以我不希望他们被包括在集合中

如果有必要,我将使用Stardog端点来运行此查询并存储图形数据。

而不是

#——在招募前减去特定药物和订单日期的结果
#--这是我认为给我带来问题的部分
减去{
过滤器(regex(?medRecord,“药物1”,“i”))
过滤器(?招聘日期-?订单日期<“P0D”^^xsd:dayTimeDuration)
}
}
我可能只写这个,不带负号:

过滤器(!regex(?medRecord,“药物1”,“i”))
过滤器(?招聘日期-?订单日期>=“P0D”^^xsd:dayTimeDuration)

<>我也可能会考虑正则表达式是否是正确的工具(简单的字符串比较是否有效),但这是另一个问题。

谢谢你的回应。我认为这种方法的问题在于,它排除了服用“药物1”但订购日期在招募日期之后的患者。为了将患者排除在外,他们需要在招募日期之前订购“Medicing_1”。@但是在任何情况下,减号本身是一个返回结果集的图形模式-在您的示例中,它总是空的,因为您没有在减号子句中选择任何三重模式。