Я узнал ответ на этот вопрос при добавлении дополнительных вещей, которые я уже заметил.
Поскольку :d1 rdf:type :Compound
и :d10 rdf:type :Compound
, на самом деле существует путь от :d1
до :d10
, и поэтому утроение примерно до :d10
также заканчивается в моих результатах запроса - что, конечно, не то, что я хотел.
Глядя на запрос, я подумал, что имеет смысл добавить дополнительное ограничение, которое ?child
не должно быть :d10
. И, думая о том, как плакат https://stackoverflow.com/a/33290642/5433896 объяснил свой запрос, я должен также исключить, что ?someSubj
или ?childPropVal
может быть :d10
:
CONSTRUCT {
:d1 ?prop ?val .
?child ?childProp ?childPropVal .
?someSubj ?incomingChildProp ?child .
}
WHERE {
:d1 (:overrides|!:overrides)+ ?child .
?child ?childProp ?childPropVal.
?someSubj ?incomingChildProp ?child.
FILTER (?child != :d10)
FILTER (?childPropVal != :d10)
FILTER (?someSubj != :d10)
}
Это исключило :d10
из результатов моего запроса. Отлично!
Но ошибка ERROR:root:This triple should not be in the results! => http://dl-learner.org/carcinogenesis#six_ring-9 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://dl-learner.org/carcinogenesis#Six_ring.
остается.
Я поиграл с удалением некоторых вероятных троек, вызвавших эту проблему, и обнаружил, что тройка { Six_ring rdf:about="#six_ring-9" }
является причиной того, что в результатах запроса остается #six_ring-9
. Итак, снова, rdf:type
(подразумевается в rdf:about
) вызывает проблему.
В идеале нам нужно описать в SPARQL, что нам интересно знать, что такое rdf:types
объектов, связанных с :d1
(например, :Compound
, :Six_Ring
), но НЕ с тем, с чем связаны другие объекты. эти типы объектов. Это решило бы ОБА проблемы, которые мы изначально обнаружили с помощью запроса.
Таким образом, этот запрос решает проблему:
CONSTRUCT {
:d1 ?prop ?val .
?child ?childProp ?childPropVal .
?someSubj ?incomingChildProp ?child .
}
WHERE {
:d1 (:overrides|!:overrides)+ ?child .
?child ?childProp ?childPropVal.
?someSubj ?incomingChildProp ?child.
FILTER (?incomingChildProp != rdf:type)
}