【问题标题】:Neo4j server plugin basic questionsNeo4j 服务器插件基本问题
【发布时间】:2014-11-09 17:56:33
【问题描述】:

我正在使用 Neo4J v2.1.5 并创建一个服务器插件。

  1. 如何创建唯一节点,即保证属性的唯一性?
  2. 是否有一个钩子可以在插件生命周期中创建约束和索引?
  3. 返回一个节点会返回完整的数据库。如何将节点或 pojo 列表作为 JSON 返回?是否有任何可用的表示的工作示例或解释?

我使用的是 Java API 而不是 Cypher。

【问题讨论】:

  • 也许把它分成 3 个单独的问题?
  • 对于#2,有一个名为 PluginLifeCycle 的接口,您可以通过 META-INF/services/... 实现和注册它,它具有启动和停止等生命周期方法。请参阅此处的示例:github.com/AtomRain/neo4j-extensions/tree/master/…
  • #2,以上项目,org.neo4j.server.plugins.PluginLifecycle 为空。 @MichaelHunger

标签: neo4j


【解决方案1】:

如何创建唯一节点即保证属性的唯一性?

您可以在(标签、属性)对上创建unique constraint,这将确保该属性的唯一性。

例如

CREATE UNIQUE CONSTRAINT ON :Person(name)

将确保您不能有两个同名的人员节点。如果你想通过 Java API 做到这一点,你会做一些事情 like this:

try ( Transaction tx = graphdb.beginTx() )
{
    graphdb.schema()
        .constraintFor( DynamicLabel.label( "Person" ) )
        .assertPropertyIsUnique( "name" )
        .create();
    tx.success();
}

是否有一个钩子可以在插件生命周期中创建约束和索引?

您可以在事务中执行此操作,但 IIRC 您只能为每个事务创建一个索引/约束。

返回一个节点会返回完整的数据库。我怎样才能只返回一个节点或一个 pojo 列表?在那里 任何可用的表示的工作示例或解释?

你的意思是来自密码?一个只返回一个节点的简单查询是这样的:

MATCH (n)
RETURN n
LIMIT 1

在 cypher land 中,它将返回节点在其上的属性的地图。如果你想得到更具体的东西,你可以试试这个:

MATCH (n:Person)
RETURN n.name AS personName
LIMIT 1

那么你会在结果集中为该列返回一个字符串。

-- Java API 更新--

您可以从 Java API 编写自己的遍历,这将返回“节点”和“关系”对象。然后,您必须从中提取您感兴趣的任何属性。

try ( Transaction tx = graphDatabaseService.beginTx() )
{
    ResourceIterable<Node> people = GlobalGraphOperations.at( graphDatabaseService ).getAllNodesWithLabel( DynamicLabel.label( "Person" ) );

    for ( Node node : people )
    {
        String name = (String) node.getProperty( "name" );
    }

    tx.success();
}

【讨论】:

  • 我正在使用 Java API。 #1 我可以在同一属性上添加唯一约束和索引吗? ID?我现在收到一个错误。 #2 返回一个节点会返回一个使用 Java API 的完整数据库。 #3 如何以 JSON 格式返回响应?
  • 不,你不能那样做。如果你创建一个唯一约束,它会自动创建一个索引,所以不需要两者都有。
  • 返回一个节点应该只是返回那个节点。你是什​​么意思它返回整个数据库?这是 Neo4j 中转换为 JSON 格式的类 - github.com/neo4j/neo4j/blob/master/community/server/src/main/…
  • 如果你只是用jackson渲染一个节点,它会渲染所有的getter,其中之一就是getGraphDatabase()。我建议将节点的相关属性复制到地图中并将该地图呈现为 json,请参阅neo4j.com/developer/java 上的 java 示例
【解决方案2】:

你好 cypher 我可以向你推荐几件事,

Q 如何创建唯一节点,即保证属性的唯一性? 答。 首先选择一个对该节点来说可能是唯一的属性,就像关系数据库系统中的主键一样, 即身份证 现在你合并创建一个节点, 合并(u:用户 { ID:1 }) 设置 u.Name='查理' 返回你 如果具有 Id 的用户不存在,它将创建它, 然后使用 set 子句您也可以设置其他属性或孔对象,

Q 返回一个节点会返回完整的数据库。如何将节点或 pojo 列表作为 JSON 返回?是否有任何可用的表示的工作示例或解释? 答。如果您传递唯一 ID 并尝试搜索它,则匹配方式相同,它将仅返回该特定节点,即 match(u:User { Id:1 }) 返回你

要创建这样的 Id,我建议您使用在 C# 等语言编程中创建的 GUID, 但是对于 neo4j 3.x,您也使用了自动增量属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多