【问题标题】:Struggling with retrieving an entity from Neo4j using a primary index努力使用主索引从 Neo4j 中检索实体
【发布时间】:2017-03-05 15:30:51
【问题描述】:

我有以下简单的继承层次结构

    abstract class Entity {

        @GraphId
        Long id;

        public Long getId() {
            return id;
        }
    }


    @NodeEntity
    public class Asset extends Entity {

        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Index(unique=true, primary=true)
        String primaryKey;

        public String getPrimaryKey() {
            return primaryKey;
        }

        public void setPrimaryKey(String primaryKey) {
            this.primaryKey = primaryKey;
        }
   }

@NodeEntity
public class Equity extends Asset {

    @Override
    public String toString() {
        return "Equity [name=" + name + ", primaryKey=" + primaryKey + "]";
    }

}

我的存储库实现为:

public class AssetServiceImpl extends GenericService<Asset> implements AssetService {

    @Override
    public Asset findPK(String primaryKey)
    {
        return session.load(getEntityType(), primaryKey, 0);
    }

    @Override
     public Asset create(Asset asset) {

            Asset foundAsset = findPK(asset.getPrimaryKey()); 
            if (foundAsset == null)
            {
                session.save(asset, 0);
                return findPK(asset.getPrimaryKey());
            }
            else
            {
                return foundAsset;
            }
    }

    @Override
    public Class<Asset> getEntityType() {
        return Asset.class;
    }
}

我正在使用简单的应用程序进行测试:

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );        

        AssetService assetService = new AssetServiceImpl();

        Equity equity1 = new Equity();
        equity1.setName("British Airways");
        equity1.setPrimaryKey("PK1");

        assetService.create(equity1);

        System.out.println(assetService.findPK("PK1"));       
        return;     
    }
}

当我运行应用程序时,Equity 会按预期在数据库中创建,其中包含所有属性和标签,以表示预期的继承。问题是 findPK 方法只会返回 null。所以从一个干净的数据库开始我

  • 找了找,没找到好的
  • 创建成功
  • 再找找没发现问题

日志显示约束的创建、权益的创建以及寻找它的尝试。从表面上看,一切都很好,但什么也没找到!我会非常感谢任何关于这方面的提示我确定我错过了一些愚蠢的东西。

Hello World!
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Starting Post-processing phase
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Building annotation class map
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Building interface class map for 14 classes
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - Post-processing complete
[main] INFO org.neo4j.ogm.metadata.ClassFileProcessor - 14 classes loaded in 80728985 nanoseconds
[main] INFO org.neo4j.ogm.service.DriverService - Using: [org.neo4j.ogm.drivers.bolt.driver.BoltDriver]
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CALL db.constraints() with params {}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CALL db.indexes() with params {}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: DROP CONSTRAINT ON ( asset:Asset ) ASSERT asset.primaryKey IS UNIQUE with params {}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: CREATE CONSTRAINT ON ( asset:Asset ) ASSERT asset.primaryKey IS UNIQUE with params {}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: UNWIND {rows} as row CREATE (n:`Equity`:`Asset`) SET n=row.props RETURN row.nodeRef as ref, ID(n) as id, row.type as type with params {rows=[{nodeRef=-1647809929, type=node, props={name=British Airways, primaryKey=PK1}}]}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1}
[main] INFO org.neo4j.ogm.drivers.bolt.request.BoltRequest - Request: MATCH (n) WHERE n.primaryKey = { id } RETURN n with params {id=PK1}
null

【问题讨论】:

    标签: neo4j neo4j-ogm


    【解决方案1】:

    很遗憾,这是 OGM 中的一个错误。您可以在这里提出问题:https://github.com/neo4j/neo4j-ogm/issues

    作为一种解决方法,您可以在 Equity 类中声明索引,因为 OGM 仅扫描层次结构中的叶类以查找主索引。

    【讨论】:

    • 感谢@nmervaillie,它给了我继续前进的动力。我怀疑一个错误。我确实尝试将主索引添加到股权,但这导致使用主键创建资产时出现问题。我会再试一次以获得更多细节。我肯定会将此报告为错误。
    • 此问题已修复,可在最新快照中使用
    • 谢谢我明天测试一下:-)
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2020-04-04
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多