我正在使用Neo4j附带的电影示例图表,我希望得到:
我可以使用
获得1 所有标签ResourceIterable<Label> allLabels = GlobalGraphOperations.at(graph).getAllLabels();
所以,我得到了:
Movie
Person
我还可以使用:
获得2 所有关系类型Iterable<RelationshipType> allRelationshipTypes = GlobalGraphOperations.at(graph).getAllRelationshipTypes();
这是:
ACTED_IN
DIRECTED
PRODUCED
WROTE
FOLLOWS
REVIEWED
最后,我可以使用以下方法获取所有属性,但不是每个标签或每个关系类型:
ResourceIterable<String> allPropertyKeys = GlobalGraphOperations.at(graph).getAllPropertyKeys();
title
released
tagline
name
born
roles
summary
rating
我想要的是:
Movie: [title, released, tagline]
Person: [name, born]
ACTED_IN: [roles]
DIRECTED: []
PRODUCED: []
WROTE: []
FOLLOWS: []
REVIEWED: [summary, rating]
是否可以使用Java API甚至执行Cypher查询? 请记住,这是在具有数百万个节点的图表中完成的。
答案 0 :(得分:2)
在Neo4j中轻松找到所有标签。您已经解决了它,这是Cypher的一个简单查询:
match (n) return distinct labels(n)
使用以下查询使用Cypher查找所有关系类型也很容易:
match (n)-[r]-() return distinct type(r)
但是,对于问题3和4,它会变得更加困难。实际上,没有经济有效的方法来获取Label的所有属性或关系类型的所有属性。
关于获取Label的所有属性。这意味着属性属于Label ,就像模式一样(例如,如果您比较RDBMS的DDL)。目前Neo4j内置的此类型的架构支持(编写时当前版本的Neo4j 是2.1.6)因为Neo4j基本上没有架构。这种结构完整性是quite often handled in the application layer for NoSQL databases。
现在可用于Neo4j的唯一模式操作是here。
目前他们包括:
CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE
CREATE INDEX ON :Person(name)
如果您想要更多结构性实施,以下内容可能有所帮助:
除此之外,还有工具NeoProfiler,其中包含许多分析器,其中大多数分析器针对您的数据库运行非常简单的Cypher查询并提供汇总统计信息。有些分析器实际上会在图表中发现数据,然后生成其他将在稍后运行的分析器。例如,如果标签名为&#34; Person&#34;在数据中发现,标签分析器将添加到运行队列中,以检查具有该标签的节点群。
为了找到&#34;属于Label&#34;的所有属性。您将不得不遍历该类型的所有节点并提取属性名称(这可能非常昂贵)。
关系类型也是如此。由于它们不是任何模式的一部分,因此查找为特定类型定义的所有属性是一项昂贵的操作(您必须遍历所有关系)。