【发布时间】:2018-12-26 17:06:26
【问题描述】:
我在按 3 个不同的属性对 prolog 中的一些事实进行分组时遇到了麻烦。 这是我的知识库(基本上是一个图表):
% entity(Label, Id)
% relationship(Type, Subject, Object)
entity('Person', id_0).
entity('Place', 1468).
relationship('wasIn', id_0, 1468).
entity('Place', 1367).
relationship('wasIn', 1468, 1367).
entity('Person', 1466).
relationship('wasIn', 1466, 1468).
entity('Place', 1478).
relationship('aliasOf', 1478, 1468).
entity('Place', 1052).
relationship('wasIn', id_0, 1052).
entity('Place', 1184).
relationship('wasIn', 1052, 1184).
entity('Person', 1048).
relationship('wasIn', 1048, 1052).
entity('Place', 1069).
relationship('wasIn', id_0, 1069).
entity('Place', 1070).
relationship('wasIn', 1069, 1070).
entity('Person', 1068).
relationship('wasIn', 1068, 1069).
我想按每个实体 ID 和主题类型对关系进行分组,所以得到如下内容:
[
[
[id_0, wasIn, Place],
% because entities 1468, 1052, 1069 are Places
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069)]
],
[
[id_0, wasIn, Some Other Subject Label],
[relationship(wasIn, id_0, ...),
...]
],
[
[1468, wasIn, Place],
[relationship(wasIn, 1468, ...),
...]
],
...
]
等等。
目前,我设法仅按主题和类型进行分组。可悲的是,我从中得到了重复(我想避免)。我尝试的任何进一步尝试都没有奏效,这就是我在这里问的原因。 这是我目前的规则:
group_relationships_by_node([[Subject, Type] | [R]]) :-
entity(_, Subject),
relationship(Type, Subject, _),
findall(relationship(Type, Subject, Object), relationship(Type, Subject, Object), R).
group_by_relationships(Result) :-
findall(X, group_relationships_by_node(X), Result).
这是我目前的结果:
[
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
% duplicate
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
% duplicate
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
[
[ 1468, wasIn ],
[ relationship(wasIn, 1468, 1367) ]
],
[
[ 1466, wasIn ],
[ relationship(wasIn, 1466, 1468) ]
],
[
[ 1478, aliasOf ],
[ relationship(aliasOf, 1478, 1468) ]
],
[
[ 1052, wasIn ],
[ relationship(wasIn, 1052, 1184) ]
],
[
[ 1048, wasIn ],
[ relationship(wasIn, 1048, 1052) ]
],
[
[ 1069, wasIn ],
[ relationship(wasIn, 1069, 1070) ]
],
[
[ 1068, wasIn ],
[ relationship(wasIn, 1068, 1069) ]
]
]
唉, 我自己也不太了解prolog, 我希望你甚至可以建议我一个更好的解决方案。
非常感谢
【问题讨论】: