SDN4 не возвращает вложенные объекты - PullRequest
0 голосов
/ 12 октября 2018

Hello Stack переполнение,

У меня есть следующая проблема:

У меня есть эти классы сущностей:

    public class UnknownEntity extends NetworkEntity{
        @Id
        @GeneratedValue(strategy = UuidStrategy.class)
        private String id;

        @Override
        public void setId(String id) {
            this.id = id;
        }

        @Override
        public String getId() {
            return id;
        }
    }


    @NodeEntity
    public class NetworkEntity {

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        @Id
        protected String id;

        public List<NetworkInterfaceEntity> getInterfaces() {
            return interfaces;
        }

        public void setInterfaces(List<NetworkInterfaceEntity> interfaces) {
            this.interfaces = interfaces;
        }

        @Relationship(type = "is_composed_of")
        protected List<NetworkInterfaceEntity> interfaces ;
    }


@NodeEntity
public class NetworkInterfaceEntity {
    public String getInterfaceId() {
        return interfaceId;
    }

    public void setInterfaceId(String interfaceId) {
        this.interfaceId = interfaceId;
    }

    public String getIpAddress() {
        return ipAddress;
    }

    public void setIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
    }

    public String getNetmask() {
        return netmask;
    }

    public void setNetmask(String netmask) {
        this.netmask = netmask;
    }

    public String getMacAddress() {
        return macAddress;
    }

    public void setMacAddress(String macAddress) {
        this.macAddress = macAddress;
    }

    public String getName() {
        return name;
    }

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

    public InterfaceState getState() {
        return state;
    }

    public void setState(InterfaceState state) {
        this.state = state;
    }

    public List<NetworkInterfaceEntity> getSubInterfaces() {
        return subInterfaces;
    }

    public void setSubInterfaces(List<NetworkInterfaceEntity> subInterfaces) {
        this.subInterfaces = subInterfaces;
    }

    public long getBytesSent() {
        return bytesSent;
    }

    public void setBytesSent(long bytesSent) {
        this.bytesSent = bytesSent;
    }

    public long getBytesRecived() {
        return bytesRecived;
    }

    public void setBytesRecived(long bytesRecived) {
        this.bytesRecived = bytesRecived;
    }

    @Id
    private String interfaceId;
    private String ipAddress;
    private String netmask;
    private String macAddress;
    private String name;
    private InterfaceState state;
    @Relationship(type = "is_composed_of")
    private List<NetworkInterfaceEntity> subInterfaces;
    private long bytesSent;
    private long bytesRecived;


}

Когда я сейчас пытаюсь запросить UnknownEntities черезNeo4j Crud Repository с пользовательским методом @Query, UnknownEntities не будет вложен в необходимые NetworkInterfaceObjects, даже если мой запрос возвращает их.

public interface UnknownEntityRepository extends CrudRepository<UnknownEntity,String> {
    @Query("MATCH (u:UnknownEntity)-[:is_composed_of]->(i:NetworkInterfaceEntity) WHERE i.ipAddress IN {0} WITH u as unknown MATCH p=(unknown)-[r*0..1]-() RETURN collect(unknown),nodes(p),rels(p)")
    List<UnknownEntity> searchMachinesByIp(List<String> ipAddresses);
}

В этом конкретном случае NetworkInterfaceEntities не содержит больше подчиненных интерфейсов, поэтому яхотите только NetworkInterfaceEntities, которые принадлежат UnknownEntity.Но когда я использую этот запрос, я получаю только UnknownEntities, где NetworkInterfaceList равен нулю.Я даже пробовал разные запросы безрезультатно, например: "MATCH p = (u: UnknownEntitie) - [: is_composed_of] - (n: NetworkInterfaceEntity) ГДЕ n.ipAddress в {0} RETURN собирать (n), узлы (p),RELS (р)».

У меня такой вопрос: если то, что я хочу, возможно даже с данными SDN4, и если да, то как я могу этого достичь, поскольку моя альтернатива - запрашивать базу данных для каждого NetworkInterface отдельно, что я считаю действительно уродливым.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 16 октября 2018

, пожалуйста, попробуйте, если возвращение полного пути так:

public interface UnknownEntityRepository extends CrudRepository<UnknownEntity,String> {
    @Query("MATCH (u:UnknownEntity)-[:is_composed_of]->(i:NetworkInterfaceEntity) WHERE i.ipAddress IN {0} WITH u as unknown MATCH p=(unknown)-[r*0..1]-() RETURN  p")
    List<UnknownEntity> searchMachinesByIp(List<String> ipAddresses);
}

работает для вас.Если нет, попробуйте назвать эти объекты, например, RETURN i as subInterfaces работает для вас.

Используете ли вы Spring Data Neo4j 4 или 5?Если у вас 4, рассмотрите возможность обновления до 5 на поддерживаемом уровне.

Пожалуйста, дайте мне знать, если это поможет.

...