Neo4j节点属性类型

11
我正在试用neo4j,想知道在节点上设置一个指定节点类型的type属性是否常见?我查找了一些相关信息,发现有人使用name属性来表示节点类型,但我想知道这是否被认为是一种良好的实践方式,或者索引是否更实用?
例如,“用户”节点将具有类型:user,这样如果索引不佳,我就可以进行全节点扫描并查找user类型。
7个回答

11

标签已经添加到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

Etc...


7

没错,这取决于你的使用情况。 如果你添加了一个类型属性并想要找到所有用户,那么你可能会遇到潜在的问题,因为你必须检查每个节点上的属性才能到达用户。在这种情况下,索引可能会更好-但在需要查询条件和关系不在索引中的所有用户的情况下不行(除非当然,你的索引是“开始”的来源)。 如果你像我一样拥有类似的图形,其中关系类型意味着两种不同的节点类型,比如A-(知道)-(B),而A或B可以是用户或客户,则它不起作用。

所以你的用例真的很重要——通常可以泛化建模,但根据你的使用模式进行“调优”是很重要的。


4

在我看来,您不应该在节点上放置类型属性。相反,引用特定“类型”的所有节点的常见方式是将所有用户节点连接到一个名为“Users”的节点。这样,从Users节点开始,您可以非常轻松地找到所有用户节点。“Users”节点本身可以进行索引,以便您可以轻松找到它,或者它可以连接到参考节点。


5
唯一的问题是,如果你有大量的用户,你会开始遇到超级节点惩罚。我在neo4django (https://github.com/scholrly/neo4django) 中现在就有这个问题,正在考虑转向混合索引/关系的方法。 - Matt Luongo
1
我见过这个模型,我猜我的担忧是如果索引/关系由于某些原因被破坏,那么节点类型就会丢失,但正如@MattLuongo所指出的那样,我们可以使用某些属性进行推断。 - Nicholas

2

我觉得这是一种常见的做法。例如,Spring Data Neo4j就是通过这种方式知道某个节点属于哪种实体类型的。每个节点都有一个“type”属性,其中包含实体的限定类名。这些属性会自动索引到“types”索引中,因此可以非常快速地查找节点。您可以按照这种方式精确实现您的用例。


2

2
我认为这取决于你自己。有些人喜欢使用索引类型属性,但我发现它们大多数情况下只在你有其他索引属性来缩小索引命中数量时才有用(例如搜索所有年龄超过21岁的用户)。
话虽如此,正如@Luanne所指出的那样,我们大多数人都会首先在图形内部解决问题。另一种做法(也是我认为更自然的做法)是使用关系类型来推断实际节点类型,即“A -(知道) -> B”,因此A必须是一个用户或其他可以“知道”的事物,而B必须是另一个用户、一个主题或其他可以“被知道”的对象。

2
对于客户端API来说,将元素类型建模为属性使得在客户端代码中实例化正确的域对象变得容易,因此我总是在每个节点/顶点上包含一个类型属性。
“type”变量名通常用于此,但是在某些语言中(如Python),“type”是保留字,因此我在Bulbs中使用“element_type”(http://bulbflow.com/quickstart/#models)。
对于边缘/关系,这不是必需的,因为它们已经包含了类型(标签) - 请注意,Neo4j也使用关键字“type”而不是关系的标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接