询问是否存在所有指定值?

时间:2017-08-29 18:13:41

标签: sparql

我在GraphDB中有这些三元组:

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

<http://example.com/greeting>
  a <http://example.com/word> ;
  rdfs:label "hello" .

我想知道我的三元店中是否有一个标签为“hello” ,另一个 标签为“goodbye”

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

ASK
WHERE
  { VALUES ?l { "goodbye" "hello" }
    ?s  a                     :thing ;
        rdfs:label            ?l
  }

我被告知是的,这是 true 好像是说至少有一个是真的。但我想知道这些模式的全部是否属实。

我可以在SPARQL ASK吗?

我也尝试了以下但得到了相同(不需要的)结果:

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

ASK
WHERE
{ VALUES (?l) { ("goodbye") ("hello") }
    ?s  a                     :thing ;
        rdfs:label            ?l
  }

完整性检查:此ASK的答案为 false

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

ASK
WHERE
{ VALUES (?l) { ("goodbye") }
    ?s  a                     :thing ;
        rdfs:label            ?l
  }

2 个答案:

答案 0 :(得分:2)

我的小组正在开发工具,将有关医院记录的表格数据转换为RDF三元组,然后执行各种清理和聚合。

  • 我已经开始了这个&#34;回答&#34;通过用样本数据写出该工作流程的图示。
  • 来自@Joshua Taylor和@ AKSW的建议的工作实施位于底部。

表格数据首先被转换为&#34;快捷三元组&#34;,它实例化最少数量的类并将所有文字值链接到这些类,即使文字值真的是&#34;更多关于&#34 34;别的。

所以表格数据如下:

+-------+------------+----------+----------+
| EncID |  EncDate   | DiagCode | CodeType |
+-------+------------+----------+----------+
|   102 | 12/05/2015 | J44.9    | ICD-10   |
|   103 | 11/25/2015 | 602.9    | ICD-9    |
|   102 | 12/05/2015 | I50.9    | ICD-10   |
+-------+------------+----------+----------+

首先变成这样的三元组(忽略EncDates和CodeTypes。)

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  obo:  <http://purl.obolibrary.org/obo/>
PREFIX  turbo: <http://example.org/ontologies/>
PREFIX  xsd:   <http://www.w3.org/2001/XMLSchema#>

INSERT DATA {
  GRAPH turbo:encounters_from_karma {
    turbo:5f62d61cee174283a4f875ccb8bb91a1 rdf:type obo:OGMS_0000097 .
    turbo:5f62d61cee174283a4f875ccb8bb91a1 turbo:ScEnc2DiagCode "J44.9" .
    turbo:5f62d61cee174283a4f875ccb8bb91a1 turbo:ScEnc2DiagCodeRegText "ICD-10" .
    turbo:5f62d61cee174283a4f875ccb8bb91a1 turbo:ScEnc2EncID "102" .

    turbo:81fcbb5c5bd141c9bde7f23321648ff7 rdf:type obo:OGMS_0000097 .
    turbo:81fcbb5c5bd141c9bde7f23321648ff7 turbo:ScEnc2DiagCode "I50.9" .
    turbo:81fcbb5c5bd141c9bde7f23321648ff7 turbo:ScEnc2DiagCodeRegText "ICD-10" .
    turbo:81fcbb5c5bd141c9bde7f23321648ff7 turbo:ScEnc2EncID "102" .

    turbo:820dd597229244ab853ed845dd740f1f rdf:type obo:OGMS_0000097 .
    turbo:820dd597229244ab853ed845dd740f1f turbo:ScEnc2DiagCode "602.9" .
    turbo:820dd597229244ab853ed845dd740f1f turbo:ScEnc2DiagCodeRegText "ICD-9" .
    turbo:820dd597229244ab853ed845dd740f1f turbo:ScEnc2EncID "103" .  }
}

然后像这样展开

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  obo:  <http://purl.obolibrary.org/obo/>
PREFIX  turbo: <http://example.org/ontologies/>

INSERT {
  GRAPH turbo:expanded_encounters {
    ?NewEnc rdf:type obo:OGMS_0000097 .
    ?NewEnc turbo:previousUriText ?previousUriText .
    ?NewEnc obo:OBI_0000299 ?DiagCrid .
    ?DiagCrid rdf:type turbo:DiagCrid .
    ?DiagCrid obo:BFO_0000051 ?DiagSymb .
    ?DiagSymb rdf:type turbo:EncounterDiagCodeSymbol .
    ?DiagSymb turbo:thingLiteralValue ?DiagSymbVal .
  }
}
WHERE
  { GRAPH turbo:encounters_from_karma
      { ?EncFromKarma
                  rdf:type              obo:OGMS_0000097 ;
                  turbo:ScEnc2DiagCode  ?DiagSymbVal
        BIND(str(?EncFromKarma) AS ?previousUriText)
        BIND(uri(concat("http://transformunify.org/ontologies/", struuid())) AS ?NewEnc)
        BIND(uri(concat("http://transformunify.org/ontologies/", struuid())) AS ?DiagCrid)
        BIND(uri(concat("http://transformunify.org/ontologies/", struuid())) AS ?DiagSymb)
      }
  }

因此看起来像这样:

@prefix turbo: <http://purl.obolibrary.org/obo/> .
@prefix obo: <http://example.org/ontologies/> .

<http://example.org/ontologies/b9dc5b08-cf1b-465e-8773-4b19bfbcf803>
  a <http://purl.obolibrary.org/obo/OGMS_0000097> ;
  turbo:OBI_0000299 <http://example.org/ontologies/8a04f52f-22d2-4aab-bacf-d96e1c7fe900> ;
  obo:previousUriText "http://example.org/ontologies/5f62d61cee174283a4f875ccb8bb91a1" .

obo:8a04f52f-22d2-4aab-bacf-d96e1c7fe900
  a obo:DiagCrid ;
  turbo:BFO_0000051 obo:6738d8c0-8bb8-4078-8430-5e9294e5af15 .

obo:6738d8c0-8bb8-4078-8430-5e9294e5af15
  a obo:EncounterDiagCodeSymbol ;
  obo:thingLiteralValue "J44.9" .

obo:d3a8a700-2eb9-420d-a863-d47462fa393c
  a turbo:OGMS_0000097 ;
  turbo:OBI_0000299 obo:c12acc26-6dbe-486d-9ae9-9f34c9561aea ;
  obo:previousUriText "http://example.org/ontologies/81fcbb5c5bd141c9bde7f23321648ff7" .

obo:c12acc26-6dbe-486d-9ae9-9f34c9561aea
  a obo:DiagCrid ;
  turbo:BFO_0000051 obo:3b784151-b369-4594-9ce3-285f5fe60850 .

obo:3b784151-b369-4594-9ce3-285f5fe60850
  a obo:EncounterDiagCodeSymbol ;
  obo:thingLiteralValue "I50.9" .

obo:af0e949a-99e4-48cd-885b-7cb1aa3dd265
  a turbo:OGMS_0000097 ;
  turbo:OBI_0000299 obo:c2da52ec-7331-4011-b8f8-6fbf8b419708 ;
  obo:previousUriText "http://example.org/ontologies/820dd597229244ab853ed845dd740f1f" .

obo:c2da52ec-7331-4011-b8f8-6fbf8b419708
  a obo:DiagCrid ;
  turbo:BFO_0000051 obo:7f8399ef-5fcd-447c-80a4-18dfb160e99c .

obo:7f8399ef-5fcd-447c-80a4-18dfb160e99c
  a obo:EncounterDiagCodeSymbol ;
  obo:thingLiteralValue "602.9" . 

最后,我可以根据@Joshua Taylor或@AKSW的建议检查正确的转换:

@Joshua Taylor

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  obo:  <http://purl.obolibrary.org/obo/>
PREFIX  turbo: <http://example.org/ontologies/>

ASK
WHERE
  { { GRAPH turbo:expanded_encounters
        { VALUES ( ?previousUriTextVal ?DiagSymbVal ) {
            ( "http://example.org/ontologies/5f62d61cee174283a4f875ccb8bb91a1" "J44.9" )
            ( "http://example.org/ontologies/820dd597229244ab853ed845dd740f1f" "602.9" )
            ( "http://example.org/ontologies/81fcbb5c5bd141c9bde7f23321648ff7" "I50.9" )
          }
          FILTER NOT EXISTS { ?NewEnc   rdf:type              obo:OGMS_0000097 ;
                                        turbo:previousUriText  ?previousUriTextVal ;
                                        obo:OBI_0000299       ?DiagCrid .
                              ?DiagCrid  rdf:type             turbo:DiagCrid ;
                                        obo:BFO_0000051       ?DiagSymb .
                              ?DiagSymb  rdf:type             turbo:EncounterDiagCodeSymbol ;
                                        turbo:thingLiteralValue  ?DiagSymbVal
                            }
        }
    }
  }

<强> @AKSW

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  obo:  <http://purl.obolibrary.org/obo/>
PREFIX  turbo: <http://example.org/ontologies/>

ASK
WHERE
  { GRAPH turbo:expanded_encounters
      { FILTER ( ?count = 3 )
        { SELECT  (COUNT(DISTINCT ?NewEnc) AS ?count)
          WHERE
            { VALUES ( ?previousUriTextVal ?DiagSymbVal ) {
                ( "http://example.org/ontologies/5f62d61cee174283a4f875ccb8bb91a1" "J44.9" )
                ( "http://example.org/ontologies/820dd597229244ab853ed845dd740f1f" "602.9" )
                ( "http://example.org/ontologies/81fcbb5c5bd141c9bde7f23321648ff7" "I50.9" )
              }
              ?NewEnc   rdf:type              obo:OGMS_0000097 ;
                        turbo:previousUriText  ?previousUriTextVal ;
                        obo:OBI_0000299       ?DiagCrid .
              ?DiagCrid  rdf:type             turbo:DiagCrid ;
                        obo:BFO_0000051       ?DiagSymb .
              ?DiagSymb  rdf:type             turbo:EncounterDiagCodeSymbol ;
                        turbo:thingLiteralValue  ?DiagSymbVal
            }
        }
      }
  }

答案 1 :(得分:2)

不要问“所有这些都存在”,而是要求“其中任何一个不存在”(然后否定结果我或你的应用程序或另一个“过滤器不存在”:

ask {
  values ?label { "hello" "goodbye" }
  filter not exists {
    ?s a :thing ; rdfs:label ?word
  }
}