2015-06-01 6 views
0

Следующий код Python является частью более крупной части (все остальное работает нормально):Получение различных значений с RDFLib

import rdflib 

g1 = rdflib.Graph() 
g1.parse("existing_graph.nt", format="nt") 

q = "select ?ent_a ?ent_b where { ?ent_a <http://www.example.org/rel> ?c . " \ 
    "?ent_b <http://www.example.org/rel> ?c. }" 
res = g1.query(q) 

Я хочу, чтобы в моих результатах только те случаи, когда ent_a отличается от ent_b и не может найти соответствующую документацию.

+0

Что именно вы пытаетесь извлечь? Почему бы вам просто не вызвать одну тройку, такую ​​как '? S? P? O'? Ваш запрос не имеет смысла в его текущей форме. Вы хотите получить две копии одного типа? – Artemis

+0

@Artemis - Я хочу получить элементы («a», «b»), которые относятся к элементу anothe («c») таким же образом, например. - два города, которые находятся рядом с одной и той же рекой, но я хочу, чтобы «а» отличалось от «б». – GalB1t

ответ

2

Вы получите каждый differerent ?a ?b пара с FILTER !=, но и ?b ?a (пара развернулась)

Если ?a и ?b являются идентификаторы URI, то эта модель может помочь:

select * 
where { 
    ?a a ?s. 
    ?b a ?s. 
filter (str(?a) > str(?b)) 
} 
+0

Они действительно и отлично работали, знаете ли вы любое место, где я могу найти хорошие элементарные фильтровальные трюки? Мне нужны некоторые из них отчаянно: – GalB1t

+0

@ GalB1t [Язык запросов SPARQL 1.1] (http://www.w3.org/TR/sparql11-query/) перечисляет все функции фильтра и имеет множество примеров. Взгляните на раздел 17. –

+0

@JoshuaTaylor - ему не хватает правильного синтаксиса python, который меня заводит :((я использую rdflib) – GalB1t

1

Самый простой способ сказать, что две вещи не то же самое - использовать знак !=.

select distinct * 
where { 
    ?a a ?s. 
    ?b a ?s. 
filter (?a!=?b) 
} 

Однако этот запрос очень странно, потому что просто писать:

select distinct * 
where { 
    ?a ?p ?s. 
} 

Вы можете извлечь каждый отчетливое ?a, который имеет ?p отношения с ?s. Таким образом, в зависимости от вашего использования вы уже создали свой набор результатов.

Если вам нужно копать глубже, а на ваш комментарий:

У меня есть онтология, где объекты типа «команда» имеет «locatedIn» отношения с их «родным», и я хотел бы найти все возможные местные дерби.

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

select distinct * 
where{ 
    ?o a dbpedia-owl:SportsTeam. 
    ?o dbpedia-owl:ground ?ground. 
} 
+0

@Arthemis - это хорошо, но не полностью работает, так как все еще возвращает «a b» и «b s a» кортежи, любая идея, как предотвратить это? BTW этот синтаксис несовместим с rdflib python, и мне нужно было удалить * – GalB1t

+0

. Я добавил некоторые объяснения тому, почему я думаю, что ваш запрос не имеет смысла. вы хотите рассказать мне, какой прецедент у вас есть для этих пар? Почему бы вам просто не получить четкие тройки и просто создать четкую пару массивов в Python? – Artemis

+0

У меня есть онтология, где объекты типа «команды» имеют отношения «locationIn» с их «родным городом», и я хочу найти все возможные местные дерби. – GalB1t