2012-04-20 273 views
10

我正在玩neo4j,我想知道,在节点上有一个type属性是很常见的,它指定了它是什么类型的节点?我尝试过寻找这种做法,并且我看到一些人使用name来达到这样的目的,但我想知道这是否被认为是一种好的做法,或者索引是否是更实用的方法?Neo4j节点属性类型

一个例子是一个“用户”节点,该节点的类型为:user,这种方式如果索引不好,我可以做一个全节点扫描并寻找user的类型。

回答

7

确实,这取决于您的使用情况。 如果您添加一个类型属性,然后希望查找所有用户,那么您将遇到潜在的麻烦,因为您必须在每个节点上检查该属性以找到用户。在这种情况下,索引可能会更好 - 但在您需要查询索引中没有可用条件和关系的所有用户的情况下(除非您的索引是“开始”的来源)。 如果你有像我这样的图,其中关系类型暗示着两种不同的节点类型,如A-(知道) - (B),而A或B可以是用户或客户,那么它不起作用。

因此,您的用例非常重要 - 您可以很容易地对一般图形进行建模,但对于根据您的使用模式“调整”它很重要。

4

恕我直言,你不应该在节点上放置一个类型属性。相反,引用特定“类型”的所有节点的通用方法是将所有用户节点连接到称为“用户”的节点。这种方式从用户节点开始,您可以很容易地找到所有用户节点。 “用户”节点本身可以​​编入索引,因此您可以轻松找到它,或者它可以连接到参考节点。

+5

与唯一的问题是,如果你拥有的用户数量巨大,你会开始打超级点球。我现在在neo4django(https://github.com/scholrly/neo4django)中这样做,并且正在考虑改用hyrbid索引/关系方法。 – 2012-04-20 18:36:25

+1

我见过这个模型,我想我担心的是,如果索引/关系因为某种原因而中断,那么节点的类型会丢失,但正如@MattLuongo指出的那样,我们可以推断使用某些属性。 – Nicholas 2012-04-20 19:09:46

2

我认为这真的取决于你。有些人喜欢索引类型属性,但我发现当你有其他索引属性来缩小索引点击数(例如,搜索21岁以上的所有用户)时,它们最有用。

这就是说,正如@Luanne指出的,我们大多数人都试图首先解决图中的问题。另一种方式(我认为更自然的方式)是使用关系类型来推断实际的节点类型,即“A-(知道) - > B”,因此A必须是用户或其他人可以“知道”的东西,B必须是另一个用户,主题或其他可以“知道”的对象。

2

对于客户端API,将元素类型建模为属性可以很容易地在客户端代码中实例化正确的域对象,因此我总是在每个节点/顶点上包含一个type属性。

“类型”var名称通常用于此目的,但在Python等某些语言中,“type”是保留字,所以我在灯泡(http://bulbflow.com/quickstart/#models)中使用“element_type”。

这不是边缘/关系所需要的,因为它们已经包含了一个类型(标签) - 注意Neo4j也使用关键字“type”代替关系中的标签。

2

我会说这是常见的做法。作为一个例子,Spring Data Neo4j完全知道某个节点是哪个实体类型。每个节点具有“类型”属性,该属性包含实体的限定类名。这些属性在“类型”索引中自动编入索引,因此可以快速查找节点。你可以像这样实现你的用例。

9

Labels已被添加到neo4j 2.0中。他们解决了这个问题。

您可以用标签创建节点:

CREATE (me:American {name: "Emil"}) RETURN me; 

您可以匹配的标签:

MATCH (n:American) 
WHERE n.name = 'Emil' 
RETURN n 

您可以设置任意数量的标签的节点上:

MATCH (n) 
WHERE n.name='Emil' 
SET n :Swedish:Bossman 
RETURN n 

你可以删除节点上的任意数量的标签:

MATCH (n { name: 'Emil' }) 
REMOVE n:Swedish 

等...