В данных RDF все, что не является пустыми узлами или IRI, является литералом. Литералы могут быть простым литералом (строка без дополнительной информации), строкой с языковым тегом или лексической формой (частью строки) с типом данных (IRI).
В ваших данных литерал с лексической формой "70"
имеет тип данных, который вы подвергли цензуре, но я предполагаю, что он должен быть xsd:double
. То есть значение равно "70"^^xsd:double
, что является числом двойной точности с плавающей запятой 70. Ваше другое литеральное значение "60"
— это просто литерал. Сравнивать эти два значения на самом деле не имеет смысла, так как одно из них является числом, а другое — строкой.
Однако у вас есть два варианта:
- Вы можете выполнить сравнение строк с простым литералом
"60"
и лексической формой "70"^^xsd:double
, и в этом случае вы должны использовать string<
или string-lessp
, в зависимости от от того, хотите ли вы учитывать регистр или нет (поскольку это строки цифровых символов, это, вероятно, не имеет значения).
- Вы можете предположить, что простой литерал
"60"
имеет лексическую форму, допустимую для xsd:double
, выполнить соответствующее преобразование, а затем сравнить "60"^^xsd:double
и "70"^^xsd:double
как числа с <
.
Я бы посоветовал вам, если возможно, очистить ваши данные (но это может быть не вариант, если они поступают откуда-то еще), чтобы вы могли выполнить числовое сравнение с <
, как в (2), но без необходимости делать преобразование во время сравнения.
В дополнение к этим проблемам с RDF, ваш код на Лиспе также имеет некоторые проблемы. if
принимает три аргумента (третий не является обязательным). Первое — это тестовое условие, а второе и третье — формы, которые оцениваются в зависимости от того, является ли первое значение истинным или нет. В вашем коде if
получает только один аргумент:
(if (>= (?NameMatch ?threshold "true" "false")))
-------------------------------------------
Это попытка вызвать >=
с одним аргументом, и это
(?NameMatch ?threshold "true" "false")
который будет вызовом функции с именем ?NameMatch
с тремя аргументами (?threshold
, "true"
и "false"
). Что вы, вероятно, хотите здесь:
(if (>= ?NameMatch ?threshold) "true" "false")
(Конечно, вам может понадобиться изменить тест, как описано выше.)
person
Joshua Taylor
schedule
03.12.2013
IF
и переменные верны...? - person Rainer Joswig   schedule 03.12.2013?var
- это логические переменные. - person Rainer Joswig   schedule 03.12.2013