当 SPARQL 中有多个条目时使用第二个过滤器

Use second filter when there are multiple entries in SPARQL

我有以下查询:

PREFIX  owl: <http://carre.kmi.open.ac.uk/ontology/risk.owl#>

SELECT distinct ?name ?value ?condition ?condition_json 
WHERE
{
?node owl:has_observable_condition ?condition .
?node owl:has_risk_evidence_ratio_value ?value .
?node owl:has_risk_factor ?factor.
?factor owl:has_risk_factor_target ?target.
?target owl:has_risk_element_name ?name.
?node owl:has_observable_condition_json ?condition_json .
FILTER regex(str(?condition), "OB_58") .}

可以查到查询结果here

正如您在第一列中看到的那样,所有条目(这是正确的术语吗?)都有 3 个元素名称,这使得数据本身重复了 2 次。有没有办法只显示一个? (最好是英文的?)我试过了

PREFIX  owl: <http://carre.kmi.open.ac.uk/ontology/risk.owl#>

SELECT distinct ?name ?value ?condition ?condition_json 
WHERE
{
  ?node owl:has_observable_condition ?condition .
  ?node owl:has_risk_evidence_ratio_value ?value .
  ?node owl:has_risk_factor ?factor.
  ?factor owl:has_risk_factor_target ?target.
  ?target owl:has_risk_element_name ?name.
  ?node owl:has_observable_condition_json ?condition_json .
  FILTER (regex(str(?condition), "OB_58")&&regex(str(?name), "en")) .}

但它 returns 是一个空的 table。 This 没有用(或者我不能适应我的情况)。

您的 "entries" 似乎是 risk_factor_targets (owl:has_risk_factor_target),它们的 risk_element_names (owl:has_risk_element_name) 有多个值。

这些 risk_element_name 值似乎是不同的语言标记翻译,但本应具有相同的含义。

@AKSW 对 filter(langmatches(lang(?name), 'en')) 的建议很好,但请注意,这只会 return ?target 英语?name.

完成修改query and results --

PREFIX  owl: <http://carre.kmi.open.ac.uk/ontology/risk.owl#>

SELECT distinct ?name ?value ?condition ?condition_json 
WHERE
{
  ?node    owl:has_observable_condition       ?condition .
  ?node    owl:has_risk_evidence_ratio_value  ?value .
  ?node    owl:has_risk_factor                ?factor .
  ?factor  owl:has_risk_factor_target         ?target .
  ?target  owl:has_risk_element_name          ?name .
  ?node    owl:has_observable_condition_json  ?condition_json .
  FILTER regex(str(?condition), "OB_58") .
  FILTER (langmatches(lang(?name), 'en')) 
}