1

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

1)要使用TAG- [has] -TAG自引用标记,并具有像{parentID,isSubTag,...}这样的属性,关于这个的好处是我可以去多个子标签级别。不过,我不确定表现如何。

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

任何帮助,将不胜感激。

PSI我要使用的Neo4j 3.0.1独立服务器和Spring数据的Neo4j 4.1.1

+0

我不知道这个问题是一个非常适合的网站,因为没有一个答案。我建议您采用最干净,最适合您的数据模型的方法,只在实践中遇到问题时担心性能。我看不出为什么你描述的两种方法表现不同;自我参照与否应该没有区别。 – Mikesname

回答

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

+0

谢谢克里斯托弗。 (标签) - [:儿童] - >(标签) - [:儿童] - >(标签)正是我需要澄清的情况。 BTW链接非常有用!感谢那 ! – Lina