Прошло несколько лет, и Йена в серии 2.10.x. Когда указанная строка закомментирована, вывод вашей программы:
original model : <ModelCom {} | >
-----
=====
original model : <ModelCom {subject @predicate object} | [subject, predicate, object]>
-----
inference model: <ModelCom {object @predicate subject; subject @predicate object} | [object, predicate, subject] [subject, predicate, object]>
и строковое представление InfModel содержит две тройки. Когда строка не закомментирована, вывод:
original model : <ModelCom {} | >
-----
inference model: <ModelCom {} | >
=====
original model : <ModelCom {subject @predicate object} | [subject, predicate, object]>
-----
inference model: <ModelCom {subject @predicate object} | [subject, predicate, object]>
и второе строковое представление InfModel имеет только одну тройку, поэтому разница все еще наблюдается. (Я включил вывод здесь, потому что в вопросе неясно какая разница наблюдалась.)
Короткий ответ: это происходит потому, что вы подлый и модифицируете model
, не сообщая infModel
, что вы изменили базовый model
. Чтобы решить эту проблему, вы должны добавить вызов infModel.rebind();
после обновления model
. То есть теперь у вас будет:
model.add(stmt);
infModel.rebind();
Когда вы сделаете это, вы получите один и тот же вывод в обоих случаях. С прокомментированной строкой:
original model : <ModelCom {} | >
-----
=====
original model : <ModelCom {subject @predicate object} | [subject, predicate, object]>
-----
inference model: <ModelCom {object @predicate subject; subject @predicate object} | [object, predicate, subject] [subject, predicate, object]>
С строкой без комментариев:
original model : <ModelCom {} | >
-----
inference model: <ModelCom {} | >
=====
original model : <ModelCom {subject @predicate object} | [subject, predicate, object]>
-----
inference model: <ModelCom {object @predicate subject; subject @predicate object} | [object, predicate, subject] [subject, predicate, object]>
Здесь я предполагаю, что написание строкового представления InfModel не приводит к выполнению какого-либо вывода, если оно еще не выполнено, а затем печатает базовую модель и затем любые дополнительные тройки, которые были выведены. В результате:
- В первом случае (когда вы печатаете
infModel
только один раз) он еще не сделал никакого вывода, поэтому он обращается к model
и делает соответствующий вывод и получает дополнительные тройки. Затем он печатает тройки model
, а затем выводит тройки.
- Во втором случае (когда вы печатаете
infModel
дважды), в первый раз, когда вы печатаете infModel
, он обращается к model
и делает некоторый вывод, но model
пуст, так что дополнительных троек нет, и затем он печатает тройки model
и дополнительные предполагаемые тройки (их нет). Затем во второй раз печатается infModel
, логический вывод уже выполнен, поэтому он печатает тройки model
(но есть дополнительный) и любые предполагаемые тройки (их нет, потому что логический вывод больше не выполнялся).
Вызов rebind()
после добавления троек к model
означает, что во втором случае дополнительные предполагаемые тройки доступны во время печати.