11

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

一个示例是“用户”节点,它的类型为:user,这样如果索引不好,我就可以进行全节点扫描并查找user.

4

7 回答 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...

于 2013-12-06T18:24:26.447 回答
7

没错,它确实取决于您的用例。如果您添加一个类型属性,然后希望找到所有用户,那么您可能会遇到麻烦,因为您必须检查每个节点上的该属性才能找到用户。在这种情况下,索引可能会做得更好——但在您需要查询索引中没有条件和关系的所有用户的情况下(当然,除非您的索引是“开始”的来源)。如果您有像我这样的图表,其中关系类型意味着两种不同的节点类型,如 A-(knows)-(B) 并且 A 或 B 可以是用户或客户,那么它就行不通了。

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

于 2012-04-21T03:50:35.090 回答
4

恕我直言,您不必在节点上放置类型属性。相反,引用特定“类型”的所有节点的常用方法是将所有用户节点连接到可能称为“用户”的节点。这样从用户节点开始,您可以很容易地找到所有用户节点。“用户”节点本身可以​​被索引,以便您可以轻松找到它,或者它可以连接到参考节点。

于 2012-04-20T05:40:58.290 回答
2

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

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

于 2012-04-20T18:39:48.103 回答
2

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

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

边缘/关系不需要这,因为它们已经包含一个类型(标签)——请注意,Neo4j 还使用关键字“类型”而不是标签来表示关系。

于 2012-04-23T00:14:16.107 回答
2

我会说这是常见的做法。例如,这正是 Spring Data Neo4j 如何知道某个节点是哪个实体类型的方式。每个节点都有“ type ”属性,其中包含实体的限定类名。这些属性在“类型”索引中自动索引,因此可以非常快速地查找节点。您可以完全像这样实现您的用例。

于 2013-03-26T12:14:26.827 回答
2

标签最近被添加到 Neo4j 2.0 ( http://docs.neo4j.org/chunked/milestone/graphdb-neo4j-labels.html )。它们目前仍在开发中,但它们解决了这个确切的问题。

于 2013-09-27T01:21:31.283 回答