1

如果我们在 neo4j 中创建自引用节点可以吗?我需要在大数据环境中使用它,所以性能真的很重要。我在这里找到了一个例子,但需要了解更多关于此的意见。一般哪一个比较好?使用自引用节点还是将它们分解为具有不同标签和关系的单独节点?我的方案是创建电子商务标签组和标签。A TAG_GROUP 有 TAGs ,这很清楚。然而,一些标签可能有子标签。所以可以有两种解决方案:

1) 使用带有 {parentID,isSubTag,...} 等属性的 TAG-[has]-TAG 自引用标签,这样做的好处是我可以去多个子标签级别。但是我不确定性能会如何。

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

任何帮助,将不胜感激。

PSI 将使用 neo4j 3.0.1 独立服务器和 Spring-Data-neo4j 4.1.1

4

1 回答 1

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

于 2016-05-10T12:55:26.157 回答