我希望在表格中保存一些关于数据的语义信息。我如何将这些信息保存在 MySQL 中,以便我可以访问数据并使用语义数据搜索文章。
例如,我有一篇关于苹果和微软的文章。语义数据将像
人物:史蒂夫·乔布斯
人物:史蒂夫·鲍尔默
公司:苹果
公司:微软
我想保存信息而不丢失史蒂夫·乔布斯和史蒂夫·鲍尔默是个人,苹果和微软是公司的信息。我还想搜索有关 Steve Jobs/Apple 的文章。
Person 和 Company 不是唯一可能的类型,因此添加新字段是不可行的。由于要保存数据的类型,不能直接使用FullText字段类型。
更新 - 这是我正在考虑的两个选项。
- 将全文列中的数据保存为序列化的 php 数组。
- 创建另一个包含 3 列的表
--
--------------------------------
| id | subject | object |
--------------------------------
| 1 | Person | Steve Ballmer |
| 1 | Person | Steve Jobs |
| 1 | Company | Microsoft |
| 1 | Company | Apple |
| 2 | Person | Obama |
| 2 | Country | US |
--------------------------------
最佳答案
您正在解决一个困难而有趣的问题!通过查看都柏林核心元数据计划,您可能会得到一些有趣的想法。
http://dublincore.org/metadata-basics/
为简单起见,将您的元数据项想象成一个表中的所有内容。
例如
Ballmer employed-by Microsoft
Ballmer is-a Person
Microsoft is-a Organization
Microsoft run-by Ballmer
SoftImage acquired-by Microsoft
SoftImage is-a Organization
Joel Spolsky is-a Person
Joel Spolsky formerly-employed-by Microsoft
Spolsky, Joel dreamed-up StackOverflow
StackOverflow is-a Website
Socrates is-a Person
Socrates died-on (some date)
这里的技巧是一些(但不是全部)您的第一列和第三列的值需要既是任意文本又作为第一列和第三列的索引。然后,如果您想弄清楚您的数据库中有哪些关于 Spolsky 的信息,您可以在第一列和第三列中全文搜索他的名字。你会得到一堆三胞胎。您找到的值会告诉您很多信息。如果想了解更多,可以再搜索一下。
要做到这一点,您可能需要有五列,如下所示:
Full text subject (whatever your user puts in)
Canonical subject (what your user puts in, massaged into a standard form)
Relation (is-a etc)
Full text object
Canonical object
主题和宾语的规范形式的要点是允许这样的查询工作,即使您的用户在两个不同的地方输入“Joel Spolsky”和“Spolsky,Joel”,即使它们表示同一个人.
SELECT *
FROM relationships a
JOIN relationships b (ON a.canonical_object = b.canonical_subject)
WHERE MATCH (subject,object) AGAINST ('Spolsky')
关于mysql - 如何在 MySQL 表中保存语义信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4062845/