2014-02-20 2 views
2

У меня есть три класса: идентификатор пациента, астма и диабет. Поэтому мне нужно получить все пациенты, у которых есть как астма, так и диабет.SPARQL запрос, чтобы получить всех пациентов, у которых есть как астма, так и диабет

Я попытался ниже упомянутый запрос,

PREFIX ioi:<http://io-informatics.com/rdf/> 
PREFIX ns:<http://io-informatics.com/rdf/Asthma#> 
PREFIX ns2:<http://io-informatics.com/rdf/Diabetes#> 


     SELECT DISTINCT * 
       WHERE { 
       ?s a ioi:PseudoPatientID 
       { ?s ?p ns2:DIAB } 
        UNION 
       { ?s ?p ns:ASTHMA } 

      } 

Но этот запрос дает мне пациентов, которые больны диабетом и пациентов, у которых астма. Это не дает мне общих пациентов, у которых есть как астма, так и диабет.

Я вроде хочу boolean И условия здесь, где я получаю тех, у кого есть диабет и астма.

Как получить этот результат через запрос SPARQL?

+0

Почему здесь переменная?? P? Похоже, было бы более разумно, если бы это было определенное свойство (например, 'hasCondition'). Можете ли вы показать образец своих данных? Мы можем попытаться «исправить» этот запрос, но, не увидев хотя бы образец ваших данных, нет гарантии, что исправление будет правильным. Более того, если астма и диабет являются _классами (а не отдельными лицами), более вероятно, что пациент будет связан с их экземпляром, а не с самим классом. –

+0

Основные тройные шаблоны _is_ и «AND». Если вы хотите что-то, что имеет оба условия, вы бы сделали что-то вроде '? X: hasCondition: Asthma. ? x: hasConditions: Diabetes .', или (даже короче, но эквивалентно) '? x: hasCondition: астма, диабет. Однако вы сказали, что астма и диабет - это _классы, поэтому пациент может быть связан с случаями таких , в котором вы бы использовали '? x: hasCondition/rdf: type: Asthma,: Diabetes .' –

ответ

5

Вы должны поместить оба условия в пункте где, как:

SELECT DISTINCT * 
    WHERE { 
     ?s a ioi:PseudoPatientID. 
     ?s ?p ns2:DIAB. 
     ?s ?p ns:ASTHMA. 
    } 

предполагая предикат ?p одинакова в обоих случаях.
, если предикат не то же самое вы можете:

  • заменить второй ?p с чем-то еще, или
  • указать предикат.
+0

Не видя данных, трудно понять, правильно это или нет. @sraf сказал, что «у меня три класса: идентификатор пациента, астма и диабет»; если диабет и астма являются классами, представляется более вероятным, что либо идентификатор связан с _instances_ этих классов, либо что идентификатор является экземпляром этих классов (это кажется странным, но может быть, как настроена модель). Кажется менее вероятным, что идентификатор будет напрямую связан с самими классами астмы и диабета. –

+0

@ JoshuaTaylor, в то время как я вижу ваши точки, это предложение кажется логичным следствием того, что OP получает * союз * пациентов с диабетом или астмой с исходным запросом. – kr1

+0

Согласен; если запрос OP возвращает часть того, что хочет OP, тогда это будет правильным изменением. Вы могли бы немного сократить это: '? S a ioi: PseudoPatientID; ? p ns2: DIAB, ns2: ASTMHA' или '? s a ioi: PseudoPatientID; ? p1 ns2: DIAB; ? p2 ns2: ASTMHA', в зависимости от того, должен ли '? p' быть одинаковым в каждом случае. –

Смежные вопросы