Как найти объекты, которые ссылаются на другой объект в 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 напрямую, но не для обоих. Так что запрос возвращает все Connections будет:

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" . 
}

и для всех Potentials запрос будет:

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 пункт, чтобы удалить те, которые вы не хотите.

Другие вопросы по тегам