Как найти объекты, которые ссылаются на другой объект в SPARQL
Прежде всего, я должен извиниться, поскольку я очень новичок в вопросах XML, RDF и SPARQL. Все мои знания основаны на 3 днях большого чтения, поэтому они не дошли до нас. Тем не менее, проблема, с которой я столкнулся при попытке запросить большой RDF-файл с использованием Jena, заключалась в том, как получить все экземпляры, которые являются частью суперкласса?
Извините, если это плохо сформулировано, вот пример. В моем файле RDF всегда есть главный узел:
Главный узел
а затем есть объекты, которые имеют этот узел в качестве ресурса, например:
<cim:Connection rdf:ID="connection_1">
<cim:Object.name>Connection Point 1</cim:Object.name>
<cim:Connection.node rdf:resource="#main_node_1"/>
</cim:Connection>
или же
<cim:Potential rdf:ID="potential_1">
<cim:Object.name>Equal Potential 1</cim:Object.name>
<cim:Potential.node rdf:resource="#main_node_1"/>
</cim:Connection>
Теперь я знаю, как запросить любой rdf:type
и (немного), как построить график запроса с использованием SPARQL. Я хочу сначала найти MainNode (что я уже могу), а затем найти все элементы / objetcs / classes / instance, которые ссылаются на этот MainNode.
С моими текущими попытками я могу запросить Connection
или же Potential
напрямую, но не для обоих. Так что запрос возвращает все Connection
s будет:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?object
WHERE {
?object cim:Connection.node ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
и для всех Potential
s запрос будет:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?object
WHERE {
?object cim:potential.node ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
Все же мне нужно извлечь оба и не хочу использовать UNION
так как может быть больше классов, которые я не включил. Моя попытка была изменить ?object
линия к:
?mainNode cim:*.name "The Main Node" .
все же звездочка *
не позволяет мне сделать любой класс доступным здесь. На самом деле, оба Connection
а также Potential
можно рассматривать как дочерние элементы суперкласса, который содержит переменную node
,
1 ответ
Я думаю, что вы просите любой узел, который находится на расстоянии одного тройного соединения от основного узла:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/2010/CIM-schema-cim15#>
SELECT ?relationship ?object
WHERE {
?object ?relationship ?mainNode .
?mainNode cim:Object.name "The Main Node" .
}
Этот запрос расскажет вам все узлы, напрямую связанные с главным узлом, и URI связующего предиката.
Если вам нужны только некоторые соединения от связанных узлов к главному узлу, то вам нужно либо перечислить их в объединении, либо добавить FILTER
пункт, чтобы удалить те, которые вы не хотите.