neo4j中的自引用节点

时间:2016-05-10 12:40:54

标签: neo4j cypher spring-data-neo4j-4 neo4j-ogm graph-modelling-language

如果我们在neo4j中创建自引用节点,这样可以吗?我需要在大数据环境中使用它,因此性能非常重要。 我找到了一个例子here,但需要了解更多有关此问题的意见。一般哪一个更好?使用自引用节点或将它们分解为具有不同标签和关系的节点? 我的方案是创建电子商务标签组和标签。 TAG_GROUP有TAG,这很清楚。但是有些标签可能有子标签。所以可以有两个解决方案:

1)要使用TAG- [has] -TAG自参考标记和{parentID,isSubTag,...}等属性,这样做的好处是我可以使用多个子标记级别。但是我不确定表现如何。

2)使用TAH- [has] -SUB_TAG。那么也许这个更简单,更容易理解。但是如果SUB_TAG本身有一个SUB_SUB标记怎么办?

任何帮助都将不胜感激。

P.S.我将使用neo4j 3.0.1独立服务器和Spring-Data-neo4j 4.1.1

1 个答案:

答案 0 :(得分:2)

在SDN的用例之外,你所描述的是一个层次结构,它绝对可以在Neo4J中自然建模。

父母/子女的概念必须与关系完成,不需要属性。

(Tag)-[:CHILD]->(Tag)-[:CHILD]->(Tag)

我假设你的产品带有相关标签,然后标签可以tags产品:

(Tag)-[:TAGS]->(Product)

查找产品的关联标签非常简单:

MATCH (product:Product {id: 1})
OPTIONAL MATCH (product)<-[:TAGS]-(tag)
RETURN product, collect(tags) as tag

OPTIONAL MATCH在没有破坏查询的情况下考虑了没有标签的产品

如果您希望每个标签的标签的完整层次结构标记产品

MATCH (product:Product {id: 1})
OPTIONAL MATCH (product)<-[:TAGS]-()<-[:CHILD*0..]-(tag)
RETURN product, collect(tag) as tags

这里0考虑了标签没有父母的情况,并将()嵌入tags集合中。

我建议您阅读以下有关建模和Cypher部分的内容,我相信有人可以为SDN方面添加答案。

http://graphaware.com/neo4j/2013/10/11/neo4j-bidirectional-relationships.html

http://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html