【问题标题】:Filter language only if the type is literal仅当类型为字面量时过滤语言
【发布时间】:2023-04-03 21:35:01
【问题描述】:

这可能与以下问题几乎相同: Filter by language only if the object is a literal

问题是那里的答案在我的情况下不起作用。

我有这个问题:

SELECT ?property ?value
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))}

Result in Virtuoso

在那里你会看到一个属性列表,包括多种语言的“alexa rating 2”和“abstract”。

如果我尝试上述问题中的建议解决方案:

SELECT ?property ?value
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))
FILTER(!isLiteral(?value) || langMatches(lang(?value), "EN"))}

Result in Virtuoso

现在您会看到只有英文版的“abstract”,但“alexa rating 2”和许多其他非字符串值都不见了。

任何人都知道如何在第一个查询中获取所有属性,然后对于文字只过滤掉英语语言?

【问题讨论】:

    标签: sparql dbpedia


    【解决方案1】:

    您的第二个查询确实 过滤掉具有非英语语言标签的文字。在 RDF 1.0 中,存在三种类型的文字:

    • 纯文字(无数据类型,无语言标签)
    • 语言标记文字(字符串和语言标记)
    • 数据类型文字(词法形式和数据类型)

    所以 Alexa 评级,它的值为 2一个文字,它没有语言标签,所以语言标签肯定不是 "EN" (更重要的是,匹配 "EN"; langMatches 做了一些更复杂的检查)。您想要的是过滤掉非英语标记的文字。这并不难;您只需将lang(?value) = "" 添加到过滤器(因为 lang 为没有语言标签的文字返回 ""):

    SELECT ?property ?value
    WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
    FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))
    FILTER(!isLiteral(?value) || lang(?value) = "" || langMatches(lang(?value), "EN"))}
    

    SPARQL results

    读取该过滤器的方法是:

    保持价值观

    1. 不是文字;
    2. 是文字,但没有语言标签;
    3. 是带有匹配“en”的语言标签的文字。

    【讨论】:

      【解决方案2】:

      所以听起来您只是想反转语言的过滤条件对吗?

      在这种情况下,您只需在 langMatches 调用之前添加一个 ! 即可反转它,即添加 not 运算符:

      SELECT ?property ?value
      WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value
      FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))
      FILTER(!isLiteral(?value) || !langMatches(lang(?value), "EN"))}
      

      Result in DBPedia

      通过这个简单的更改,现在删除了英文条目,我只看到了非英文条目。

      【讨论】:

      • 我认为这是不对的。我认为OP希望保留所有没有语言标签的文字,并且只保留那些语言与“en”匹配的语言标签文字。
      猜你喜欢
      • 2014-03-08
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      相关资源
      最近更新 更多