我正在玩neo4j,我想知道,在节点上有一个type
属性是否常见,它指定了什么类型的Node?我已经尝试过寻找这种做法,我看到有些人使用name
这样的目的,但我想知道它是否被认为是一种好的做法,或者索引是否更实用?< / p>
一个例子是“用户”节点,其类型为:user
,这样如果索引不好,我就可以进行全节点扫描并查找{{ 1}}。
答案 0 :(得分:10)
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
等等...
答案 1 :(得分:7)
是的,这取决于您的使用案例。 如果你添加一个类型属性,然后希望找到所有用户,那么你就有可能遇到麻烦,因为你必须在每个节点上检查该属性才能找到用户。在这种情况下,索引可能会做得更好 - 但是在您需要查询索引中没有条件和关系的所有用户的情况下(当然,除非您的索引是“开始”的来源)。 如果您有类似我的图表,其中关系类型意味着两个不同的节点类型,如A-(知道) - (B)和A或B可以是用户或客户,那么它不起作用。
因此,您的用例非常重要 - 通常可以很容易地对图表进行建模,但根据您的使用模式对其进行“调整”非常重要。
答案 2 :(得分:4)
恕我直言,您不必在节点上放置类型属性。相反,引用特定“类型”的所有节点的常用方法是将所有用户节点连接到称为“用户”的节点。这样从“用户”节点开始,您可以非常轻松地找到所有用户节点。 “用户”节点本身可以编制索引,以便您可以轻松找到它,或者可以将其连接到参考节点。
答案 3 :(得分:2)
我认为这取决于你。有些人喜欢索引类型属性,但我发现当你有其他索引属性来缩小索引命中数时(例如搜索21岁以上的所有用户),它们最有用。
那就是说,正如@Luanne指出的那样,我们大多数人都试图先在图中解决问题。另一种方法(在我看来更自然的方式)是使用关系类型推断实际节点类型,即“A - (know) - &gt; B”,所以A必须是用户或某些其他可以“知道”的东西,B必须是另一个用户,一个主题或其他一些可以“知道”的对象。
答案 4 :(得分:2)
对于客户端API,将元素类型建模为属性可以很容易地在客户端代码中实例化正确的域对象,因此我总是在每个节点/顶点上包含一个type属性。
“type”var名称通常用于此,但在某些语言(如Python)中,“type”是保留字,因此我在Bulbs(http://bulbflow.com/quickstart/#models)中使用“element_type”。
边/关系不需要这样,因为它们已经包含一个类型(标签) - 请注意,Neo4j也使用关键字“type”而不是标签来表示关系。
答案 5 :(得分:2)
我说这是常见做法。例如,这正是Spring Data Neo4j知道某个节点是哪个实体类型的原因。每个节点都具有“类型”属性,该属性包含实体的限定类名。这些属性在“类型”索引中自动编入索引,因此可以非常快速地查找节点。你可以像这样实现你的用例。
答案 6 :(得分:2)
标签最近被添加到Neo4j 2.0(http://docs.neo4j.org/chunked/milestone/graphdb-neo4j-labels.html)。它们目前仍处于开发阶段,但它们解决了这个问题。