2017-05-02 39 views
0

我是neo4j的新手,希望对db设计理念有所帮助。Neo4j数据库 - 链接或属性?

我有动物1000个在我的数据库,每个大约10种之一(牛,绵羊,山羊,猫,狗.....)

在关系数据库我将有一个动物表和物种表,每个动物的物种将通过动物ID和物种ID之间的连接来定义。

在neo4j中,“显而易见的”方法是将动物作为节点和物种作为其属性之一。但是,这似乎是一个倒退的步骤,因为我面临维护1000个具有拼写差异风险的物种名称副本的经典问题。

或者,我有1,000个动物节点和10个“物种”节点,每个动物指向成与IS_A关系的物种:

(菊花:动物) - [IS_A] - >(牛:母牛)

即 '感觉' 可怕笨拙。几乎每个搜索都将针对特定的动物/物种组合进行搜索。

什么是“首选”解决方案?

有一堆类似的决定。例如,每只动物都是“活着”或“死亡”。我是否拥有这样的财产?或者我将动物指向两个称为活着和死亡的节点之一?

感谢任何指针

回答

0

你可以尝试使用物种标签,并在节点作为该物种的动物:

(daisy:Cow{name:'daisy'}), (daffy:Duck{name:'daffy'}) 

如果您需要运行在多个种类的查询,将它们视为动物例如,您可以对所有节点多标签:Cow,:Duck等节点也标记为:Animal。

这里的缺点是节点标签在搜索中不能动态变化(或者至少,你不能像这样利用索引搜索)。

因此,如果用户可以输入参数name:'daisy'species:cow,最快的查找(因为你有一个动态的标签处理),将有一个指数:Animal(name),并在此指数进行的比赛,然后在过滤器种类:

MATCH (animal:Animal) 
WHERE animal.name = $name 
AND $species in labels(animal) 
RETURN animal 

这不是比拥有一个物种在野外很大的不同:动物的节点,但它更容易在你的图表(call db.labels)的可视性和报告为标签,这样的错误拼写应该是更容易既现货又正确。一般而言,如果您的查找倾向于为type + some property value,那么将此类型建模为节点标签并在该组合上创建索引以进行快速查找是一种很好的选择。对于布尔状态,所有选项都可用(节点标签,:与LifeState节点的关系如下:动物节点,布尔isAlive或isDead属性)。我个人比较喜欢这里的布尔属性。