Опция 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".