如何在图形数据库中建模颜色[neo4j]



我正在练习Neo4j。我试图模拟颜色和它们之间的关系,但我不知道如何处理不同的颜色名称。例如,看起来(从我在网上看到的),水,青色,蓝绿色或多或少是相同的颜色。

我想为颜色建模,这样我就可以将每种颜色分类在它的类别中(主要,次要,第三种),在它的家族中(温暖,凉爽,中性)。

我还想表示不同颜色的深浅、色调和色调。

我如何建模,x是一个色调的y和y是一个原色,例如?这正变得越来越困难。我希望每种颜色都是一个单独的NODE。

感谢您的宝贵时间。

老实说,这实际上取决于您希望如何查询数据。您可以像十六进制代码或上面描述的属性的序列化JSON字符串一样简单地表示颜色,然后您只需要一个属性。但是如果颜色是你的模型的基本部分,那么你可以得到非常详细的东西,并把它们分成单独的节点和关系。我在这里假设。

所以你可以有,例如,Color, Level, Family, Shade,等等…标签。对于Color之后的标签,你可以直接创建它们,或者你可以使用MERGE只在需要的时候创建它们。

然后您可以简单地创建颜色节点和关系,如:

CREATE (color:Color {hex: '#FFFFFF', name: 'White'})

然后:

MATCH (white:Color {hex: '#FFFFFF'}), (primary:Level {name: 'Primary'})
CREATE (white)-[:IS_LEVEL]->(primary)

同样,如果您想通过查找颜色之间的公共路径进行查询,则可以使用此方法。如果你只是想知道#FFFFFF是否是原色,你可以有一个level属性,值为Primary

旁注:我建议阅读Randall Munroe的颜色调查结果博客文章,因为它太棒了。

编辑:

根据你的评论,如果你想有不同的颜色名称,你可以有一个数组属性的name(或name属性,这是一个字符串和alternative_names属性,这是一个数组),或者你可以有一个ColorName节点与name属性,然后(:Color)-[:HAS_NAME]->(:ColorName)的关系。

如果你的数据库增长得非常大,一个考虑因素是Neo4j还不支持对数组属性的索引(我认为你可以用遗留索引来做)。所以像这样可以:

MATCH (color:Color) WHERE 'Red' IN color.names RETURN *

但是它需要查看每个Color节点。如果你有一个ColorName标签,那么你可以为ColorName(name)创建一个索引。但是,这样做的代价是,将更多的属性提取到单独的节点中,您的查询开始变得更加难以维护,因为每次要显示有关颜色的信息时都需要包含这些额外的节点。你开始进入像;

这样的查询
MATCH (color:Color)
WHERE color.hex = '#FFFFFF'
OPTIONAL MATCH (color)-[:HAS_LEVEL]->(level:ColorLevel)
WITH color, level
OPTIONAL MATCH (color)-[:HAS_NAME]->(color_name:ColorName)
WITH color, level, collect(color_name.name) AS names
// etc....
RETURN color, level, names, etc...

最新更新