SPARQL: Найдите различия и общие элементы в 2 наборах

Я новичок в SPARQL и изо всех сил пытаюсь достичь этих двух целей, и мне нужна ваша помощь. У меня есть 2 класса, в которых я сохранил ключевые слова python и CPP соответственно. Теперь я намерен найти общие ключевые слова из этих двух наборов, а также разницу между ними (имеется в виду ключевые слова, которые существуют в python, но не в CPP, и наоборот). Я пробовал МИНУС и НЕ СУЩЕСТВУЕТ версии запросов, но не помогло. Чтобы найти разницу в 2 наборах, я попробовал следующий запрос:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
    { FILTER NOT EXISTS {?subject a cpp:Keywords} }
    }

Чтобы найти общие элементы в двух наборах, я попробовал следующий запрос:

select ?subject
where{ ?subject a python:Keywords. FILTER  EXISTS { ?object a cpp:Keywords}
}

Ни один из них не работает. Пожалуйста помоги


person Saurabh Agrawal    schedule 16.11.2014    source источник
comment
Действительно ли SELECT ?subject WHERE { ?subject a python:Keywords. } возвращает то, что вы ожидаете? И так же для cpp:Keywords? Это соответствующие ключевые слова?   -  person Abecee    schedule 16.11.2014
comment
Да. Он возвращает мне список всех ключевых слов из python и cpp соответственно. Теперь мне нужно найти общие черты и различия между этими двумя наборами.   -  person Saurabh Agrawal    schedule 17.11.2014


Ответы (2)


SELECT ?subject
  WHERE 
  { ?subject a python:Keywords .
    ?subject a cpp:Keywords .
  }

должен дать вам общие ключевые слова.

SELECT ?subject
  WHERE 
  { ?subject a python:Keywords. 
    FILTER NOT EXISTS {?subject a cpp:Keywords}
  }

должны возвращать ключевые слова python, которые не являются ключевыми словами cpp.

person Abecee    schedule 16.11.2014
comment
Первый запрос более лаконичен: ?subject a python:Keywords, cpp:Keywords. - person Joshua Taylor; 17.11.2014

проблема в вашем коде

В вашем первом запросе проблема заключается в том, что вы поместили фильтр в другой набор фигурных скобок. То есть у вас есть:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
    { FILTER NOT EXISTS {?subject a cpp:Keywords} }
    }

но должен был вместо этого:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
      FILTER NOT EXISTS {?subject a cpp:Keywords}
    }

Разница важна, потому что первая фильтрует совпадения для включающего шаблона, что на самом деле не имеет никакого эффекта.

Решение

После этого вам нужен Abecee answer. Пересечение — это просто вещи, которые относятся к обоим типам:

?x a :type1, :type2 

и разница в том, что вещи относятся к одному типу, а не к другому:

?x a :type1
filter not exists { ?x a :type2 }

Похожие вопросы и ответы

person Joshua Taylor    schedule 17.11.2014