在Neo4j中获取每种类型的节点属性和每种类型的关系属性

时间:2015-01-19 17:43:48

标签: neo4j

我正在使用Neo4j附带的电影示例图表,我希望得到:

  1. 所有标签
  2. 所有关系名称
  3. 每个标签的所有属性
  4. 每种关系类型的所有属性
  5. 我可以使用

    获得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查询? 请记住,这是在具有数百万个节点的图表中完成的。

1 个答案:

答案 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)

如果您想要更多结构性实施,以下内容可能有所帮助:

  • Structr,Neo4j上方的一层,除此之外还强制执行更严格的架构(请查看架构文档here
  • SylvaDB,一个易于使用的Neo4j层,也有架构支持。似乎非常

除此之外,还有工具NeoProfiler,其中包含许多分析器,其中大多数分析器针对您的数据库运行非常简单的Cypher查询并提供汇总统计信息。有些分析器实际上会在图表中发现数据,然后生成其他将在稍后运行的分析器。例如,如果标签名为&#34; Person&#34;在数据中发现,标签分析器将添加到运行队列中,以检查具有该标签的节点群。

为了找到&#34;属于Label&#34;的所有属性。您将不得不遍历该类型的所有节点并提取属性名称(这可能非常昂贵)。

关系类型也是如此。由于它们不是任何模式的一部分,因此查找为特定类型定义的所有属性是一项昂贵的操作(您必须遍历所有关系)。