Как выбрать недвижимость в соответствии с условием в RDF - PullRequest
0 голосов
/ 19 сентября 2018

В следующем примере RDF я хотел бы получить значение одного из свойств в соответствии с условием.Условие ниже:

  • Если значение свойства referProperty равно "ex:sender", тогда я получу значение свойства ex:sender.
  • Если значение свойства referProperty равно "ex:reciever", тогда я получу значение свойства ex:reciever.
@prefix ex: <http://www.example.org#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:mail1
  ex:sender "John"^^xsd:string ;
  ex:receiver "Bill"^^xsd:string ;
  ex:paymentType ex:paymentType1 .

ex:mail2
  ex:sender "Jack"^^xsd:string ;
  ex:receiver "Tom"^^xsd:string ;
  ex:paymentType ex:paymentType2 .

ex:paymentType1
  ex:paymentTypeDescription "PREPAID"^^xsd:string ;
  ex:referProperty "ex:sender"^^xsd:string .

ex:paymentType2
  ex:paymentTypeDescription "COLLECT"^^xsd:string ;
  ex:referProperty "ex:receiver"^^xsd:string .

Sparql для получения значения ниже:

PREFIX ex:<http://ww....ex#>
SELECT ?mail ?refProp ?payer
WHERE
{
    {
        SELECT ?mail ?refProp
        WHERE
        {
            ?mail ex:paymentType / ex:referProperty ?refProp.
        }
    }
    ?mail ?refProp ?payer.
}

Возможно получить значение с помощью Sparql.Но я сомневаюсь, что использование вышеупомянутого образца RDF и Sparql нерегулярно, потому что, кажется, выходит за пределы логики предикатов первого порядка.Использование значения, полученного из литерального узла, в качестве переменной для поиска свойства нерегулярно.Теоретически, свойство "ex: referProperty" должно быть определено в RDFS.Ты так думаешь?Если вы так думаете, научите меня обычному способу, который включает в себя правильный RDF и правильный Sparql.

1 Ответ

0 голосов
/ 19 сентября 2018

Опция 1

Можно преобразовать URI в строки и наоборот, используя STR(), IRI() и REPLACE():

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ?p ?payer; ex:paymentType/ex:referProperty ?str.
   FILTER (replace(str(?p), str(ex:), "ex:") = ?str)
}

или

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ?p ?payer; ex:paymentType/ex:referProperty ?str.
   FILTER (URI(replace(?str, "ex:", str(ex:))) = ?p)
}

Опция 2

Вы можете выполнить свои условия, используя BIND и IF:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
   ?mail ex:paymentType/ex:referProperty ?str.
   BIND (IF(?str = "ex:sender", ex:sender, ex:receiver) AS ?p)
   ?mail ?p ?payer.
}

Опция 3

Использование VALUES:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
    VALUES (?str ?uri) {("ex:sender" ex:sender) ("ex:receiver" ex:receiver)}
    ?mail ?uri ?payer; ex:paymentType/ex:referProperty ?str.
}

Вариант 4

Поскольку предложил Дамиан Огнянов, вы можете использовать URI вместо строк в ваших справочных данных, т.е. ex:sender вместо "ex:sender" и т. д. Тогда ваш запрос будет просто следующим:

PREFIX ex: <http://www.example.org#>
SELECT ?mail ?str ?payer {
    ?mail ?uri ?payer; ex:paymentType/ex:referProperty ?uri.
}

Обновление

С ваш комментарий :

Не используется ли ex:sender как свойство и объект в одном противоречии RDF?Использование ex:sender в качестве URI в RDF делает границу между RDF сомнительной.

From Концепции RDF 1.1 и абстрактный синтаксис :

набор узлов графа RDF - это набор субъектов и объектов троек в графе.
Возможно, что предикат IRI также может появиться как узел в том же графе.

В RDF "свойства" (или, скорее, их "типы") являются объектами первого класса.
RDFS - это скорее словарь (который вводит, например, понятие rdf:Property), чем схема.
В RDF нет четкого различия между "ABox" и "TBox".

...