2015-10-27 43 views
0

我正在练习Neo4j。我试图模拟颜色和他们的关系,但我不知道如何处理不同的颜色名称。例如,它看起来像(从我在网上看到的),aqua,青色,teal或多或少是相同的颜色。如何在图形数据库中建模颜色[neo4j [

我想模型的颜色,如我可以在它的家庭(温暖,凉爽,中立)的分类(主要,次要,第三级),每种颜色分类。

我也想要表示不同颜色的色调,色调和色调。

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

谢谢你的时间。

回答

0

老实说,这实际上取决于你想如何查询你的数据。您可以将颜色简单地表示为十六进制代码或上面描述的属性的序列化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是否为主色,则可以使用Primary具有level属性。

附注:我建议阅读兰德尔·门罗的color survey results博客文章,因为它是真棒。

编辑:基于

您的评论,如果你想有不同的名称为一种颜色,你可以要么为name数组属性(或者一个name属性,它是一个字符串和一个alternative_names属性,该属性是一个数组),也可具有带name属性,然后一个(:Color)-[:HAS_NAME]->(:ColorName)关系的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... 
+0

很好的回应。这就是我用模型建立的路径。但是,我发现很难处理每个颜色节点的“名称”属性,因为多个颜色具有不同的名称。如何处理命名变化,以便我可以找到一个节点,无论它是指青色还是水色。 – user3604212

相关问题