我正试图利用我的spring数据Neo4J4.0中的时间树库。0项目。
如本页所述,https://github.com/graphaware/neo4j-timetree,我编辑了我的neo4j。属性文件以启用自动事件附加,将时间树依赖项添加到my gradle,并在具有长数据类型的事件节点中设置属性“creationDate”。尽管一切看起来都应该如此,但它仍然没有创建任何时间树。
以下是我的neo4j.property文件:
# Runtime must be enabled like this
com.graphaware.runtime.enabled=true
# A Runtime module that takes care of attaching the events like this (TT is the ID of the module)
com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper
# Nodes which represent events and should be attached automatically have to be defined
com.graphaware.module.TT.event=hasLabel('StructureVersionChange'),hasLabel('RuleVersionChange'),hasLabel('FilterVersionChange')
# Optionally, a property on the event nodes that represents the the time (long) at which the event took place must be specified (defaults to "timestamp")
com.graphaware.module.TT.timestamp=creationDate
# Optionally, a resolution can be specified (defaults to DAY)
com.graphaware.module.TT.resolution=SECOND
# Optionally, a time zone can be specified (defaults to UTC)
com.graphaware.module.TT.timezone=CEST
# Optionally, a relationship type with which the events will be attached to the tree can be specified (defaults to AT_TIME)
com.graphaware.module.TT.relationship=CREATED_ON
# autoAttach must be set to true
com.graphaware.module.TT.autoAttach=true
实际上,在此之前,我试图在我的项目中使用JAVA API版本的Timetree,但是后来我真的被timetree构造函数的参数类型弄糊涂了,这就是Node。然而,在Spring,我的节点有他们的类的类型。
提前感谢您,您的建议将非常感谢!
编辑:
neo4j.properties
# Runtime must be enabled like this
com.graphaware.runtime.enabled=true
# A Runtime module that takes care of attaching the events like this (TT is the ID of the module)
com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper
# Nodes which represent events and should be attached automatically have to be defined
com.graphaware.module.TT.event=hasLabel('FilterVersionChange') || hasLabel('StructureVersionChange') || hasLabel('CodeUnitVersionChange') || hasLabel('RuleVersionChange') || hasLabel('EpisodeVersion')
# Optionally, a property on the event nodes that represents the the time (long) at which the event took place must be specified (defaults to "timestamp")
com.graphaware.module.TT.timestamp=creationDate
# Optionally, a resolution can be specified (defaults to DAY)
com.graphaware.module.TT.resolution=SECOND
# Optionally, a time zone can be specified (defaults to UTC)
com.graphaware.module.TT.timezone=CEST
# Optionally, a relationship type with which the events will be attached to the tree can be specified (defaults to AT_TIME)
com.graphaware.module.TT.relationship=CREATED_ON
# autoAttach must be set to true
com.graphaware.module.TT.autoAttach=true
数据/日志/neo4j。0
May 17, 2015 4:07:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:07:42 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:07:43 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:11:39 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
May 17, 2015 4:28:49 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.18.1 02/19/2014 03:28 AM'
数据/图表。数据库/消息
2015-05-17 14:28:46.537+0000 INFO [o.n.k.i.DiagnosticsManager]: --- INITIALIZED diagnostics START ---
2015-05-17 14:28:46.538+0000 INFO [o.n.k.i.DiagnosticsManager]: Neo4j Kernel properties:
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.resolution=DAY
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.timestamp=creationDate
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.relationship=CREATED_ON
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.event=hasLabel('FilterVersionChange') || hasLabel('ArchitectureUnitVersionChange') || hasLabel('CodeUnitVersionChange') || hasLabel('RuleVersionChange') || hasLabel('EpisodeVersion')
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: store_dir=C:\NEO4J-~1.1\data\graph.db
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.runtime.enabled=true
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.autoAttach=true
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: remote_shell_enabled=true
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.timezone=CEST
2015-05-17 14:28:46.541+0000 INFO [o.n.k.i.DiagnosticsManager]: com.graphaware.module.TT.1=com.graphaware.module.timetree.module.TimeTreeModuleBootstrapper
2015-05-17 14:28:46.544+0000 INFO [o.n.k.i.DiagnosticsManager]: Diagnostics providers:
2015-05-17 14:28:46.544+0000 INFO [o.n.k.i.DiagnosticsManager]: org.neo4j.kernel.configuration.Config
...
...
2015-05-17 14:28:48.656+0000 INFO [o.n.k.i.DiagnosticsManager]: --- STARTED diagnostics for KernelDiagnostics:StoreFiles END ---
2015-05-17 14:28:48.696+0000 INFO [o.n.k.EmbeddedGraphDatabase]: Database is now ready
2015-05-17 14:28:48.696+0000 INFO [o.n.s.d.LifecycleManagingDatabase]: Successfully started database
2015-05-17 14:28:48.699+0000 INFO [o.n.k.i.DiagnosticsManager]: --- SERVER STARTED START ---
2015-05-17 14:28:48.736+0000 INFO [o.n.s.CommunityNeoServer]: Starting HTTP on port :7474 with 8 threads available
2015-05-17 14:28:48.872+0000 INFO [o.n.s.CommunityNeoServer]: Enabling HTTPS on port :7473
2015-05-17 14:28:48.989+0000 INFO [o.n.s.w.Jetty9WebServer]: Mounting static content at [/webadmin] from [webadmin-html]
2015-05-17 14:28:49.023+0000 INFO [o.n.s.w.Jetty9WebServer]: Mounting static content at [/browser] from [browser]
2015-05-17 14:28:49.956+0000 INFO [o.n.s.CommunityNeoServer]: Server started on: http://localhost:7474/
2015-05-17 14:28:49.956+0000 INFO [o.n.s.CommunityNeoServer]: Remote interface ready and available at [http://localhost:7474/]
2015-05-17 14:28:49.956+0000 INFO [o.n.k.i.DiagnosticsManager]: --- SERVER STARTED END ---
类实体
@NodeEntity
public class FilterVersionChange extends UnitVersion {
@GraphId
private Long id;
public FilterVersionChange() {
super();
}
public FilterVersionChange(String description, Date creationDate)
{
super(description, creationDate);
}
@Relationship(type="CONTAINS", direction = Relationship.OUTGOING)
private Set<FilterState> filterStates;
@Relationship(type="PREVIOUS", direction = Relationship.OUTGOING)
private FilterVersionChange previousFilterVersionChange;
@Relationship(type="REFERENCES", direction = Relationship.OUTGOING)
private FilterVersionChange referencedFilterVersionChange;
@Relationship(type="ADDED", direction = Relationship.OUTGOING)
private Set<FilterState> newFilterStates;
@Relationship(type="DELETED", direction = Relationship.OUTGOING)
private Set<FilterState> deletedFilterStates;
@Relationship(type="MODIFIED", direction = Relationship.OUTGOING)
private Set<ModifiedUnitState> modifiedFilterStates;
public void contains(Set<FilterState> filterStates) {
this.filterStates = filterStates;
}
public void previous(FilterVersionChange previousFilterVersionChange) {
this.previousFilterVersionChange = previousFilterVersionChange;
}
public void references(FilterVersionChange referencedFilterVersionChange) {
this.referencedFilterVersionChange = referencedFilterVersionChange;
}
public void added(Set<FilterState> newFilterStates) {
this.newFilterStates = newFilterStates;
}
public void deleted(Set<FilterState> deletedFilterStates) {
this.deletedFilterStates = deletedFilterStates;
}
public void modified(Set<ModifiedUnitState> modifiedFilterStates) {
this.modifiedFilterStates = modifiedFilterStates;
}
}
存储库
@Repository
public interface FilterVersionRepository extends GraphRepository<FilterVersion> {
@Query("MATCH (project:Project {name:{0}})-[:HAS_FILTER_VERSION]->(filterVersion:FilterVersion {name:{1}}) RETURN filterVersion")
FilterVersion findFilterVersionByName(String projectName, String filterVersionName);
}
调用函数
public FilterVersionChange createNewFilterVersionChange(String projectName,
String filterVersionName,
String filterVersionChangeDescription,
Set<FilterState> filterStates)
{
FilterVersion filterVersion = filterVersionRepository.findFilterVersionByName(projectName, filterVersionName);
if(filterVersion != null)
{
for(FilterState filterState : filterStates)
{
Filter filter = new Filter(filterState.getMatchingString(), filterState.getMatchingType());
filterState.stateOf(filter);
}
Set<FilterVersionChange> filterVersionChanges = new HashSet<FilterVersionChange>();
FilterVersionChange filterVersionChange = new FilterVersionChange(filterVersionChangeDescription, new Date());
filterVersionChange.contains(filterStates);
filterVersionChange.added(filterStates);
filterVersionChanges.add(filterVersionChange);
filterVersion.tracks(filterVersionChanges);
filterVersionRepository.save(filterVersion);
return filterVersionChange;
}
else
{
return null;
}
}
过滤网。班
@NodeEntity
public class FilterVersion {
@GraphId
private Long id;
private String name;
private String description;
private Date creationDate;
public FilterVersion() {
}
public FilterVersion(String name, String description, Date creationDate) {
this.name = name;
this.description = description;
this.creationDate = creationDate;
}
@Relationship(type = "TRACKS", direction = Relationship.OUTGOING)
private Set<FilterVersionChange> filterVersionChanges;
@Relationship(type = "HAS_FILTER_VERSION", direction = Relationship.INCOMING)
private Project project;
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public void tracks(Set<FilterVersionChange> filterVersionChanges) {
this.filterVersionChanges = filterVersionChanges;
}
public void belongsTo(Project project) {
this.project = project;
}
public Project getProject() {
return project;
}
}
单位版本。班
@NodeEntity
public class UnitVersion {
@GraphId
protected Long id;
private String description;
private Long creationDate;
public UnitVersion() {
}
public UnitVersion(String description, Date creationDate) {
this.description = description;
this.creationDate = creationDate.getTime();
}
@Relationship(type = "MAPPED_ON", direction = Relationship.OUTGOING)
private UnitVersion unitVersion;
public void setDescription(String description) {
this.description = description;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate.getTime();
}
public void mappedOn(UnitVersion unitVersion) {
this.unitVersion = unitVersion;
}
}
定义时间树的可能标签的语法稍有不同,如InclusionPolicy文档中所述https://github.com/graphaware/neo4j-framework/tree/master/common#inclusion-政策
语法如下所示:
com.graphaware.module.TT.event=hasLabel('StructureVersionChange')||hasLabel('RuleVersionChange')||hasLabel('FilterVersionChange')
出于调试目的,您可能希望将这些行添加到conf/custom-logback.xml文件中:
<appender name="EXTENSIONLOG" class="ch.qos.logback.core.FileAppender">
<file>data/log/extensions.log</file>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSSZ} %-5level [%logger{15}]: %message%n</pattern>
</encoder>
</appender>
<logger name="com.graphaware" level="debug">
<appender-ref ref="EXTENSIONLOG"/>
</logger>
看看这些扩展。日志文件
只有在以编程方式使用时间表时,依赖项才有用。如果您的应用程序运行在Neo4j服务器上,那么您需要下载并保存到Neo4j服务器插件目录:
a)GraphAware框架(选择Community或Enterprise)
b) 时间树模块
两者都可以从http://graphaware.com/products/
如果没有这个,即使在neo4j.properties中配置,GraphAware运行时也不会启动,时间表也不会工作。
如果您想通过测试运行您的代码,那么您需要包含TimeTree和GraphAware运行时的依赖项,并使用以下代码启动GraphAware运行时:
GraphAwareRuntime runtime = GraphAwareRuntimeFactory.createRuntime(getDatabase());
runtime.registerModule(new TimeTreeModule("timetree",
TimeTreeConfiguration
.defaultConfiguration()
.with(new NodeInclusionPolicy() {
@Override
public boolean include(Node node) {
return node.hasLabel(DynamicLabel.label("User"));
}
})
})
.withRelationshipType(DynamicRelationshipType.withName("CREATED_ON"))
.withTimeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+1")))
.withTimestampProperty("createdOn")
.withResolution(Resolution.DAY)
,
getDatabase()));
runtime.start();
然后您可以编写测试,例如
@Test
public void shouldSaveUser()
{
User user = new User( "Michal" );
user.setCreatedOn(1431937636995l);
userRepository.save( user );
assertSameGraph( getDatabase(), "CREATE (u:User:Person {name:'Michal', createdOn:1431937636995})," +
"(root:TimeTreeRoot)," +
"(root)-[:FIRST]->(year:Year {value:2015})," +
"(root)-[:CHILD]->(year)," +
"(root)-[:LAST]->(year)," +
"(year)-[:FIRST]->(month:Month {value:5})," +
"(year)-[:CHILD]->(month)," +
"(year)-[:LAST]->(month)," +
"(month)-[:FIRST]->(day:Day {value:18})," +
"(month)-[:CHILD]->(day)," +
"(month)-[:LAST]->(day)," +
"(day)<-[:CREATED_ON]-(u)"
);
}
有没有人使用Java API使用GraphAware TimeTree处理Spring数据Neo4J,并能提供一个简单的示例?
Neo4j 2.0。0已发布。所以我更新了neo4j版本2.0。0.M6到2.0。0.0发布。并尝试在我的网站中更新模型,但出现异常。 组织。springframework。刀。DataIntegrityViolationException:唯一属性类java。lang.String rankStatId rel:false idx:true被设置为重复值3073631_99 MY SDN版本是2
包org.springframework.data.neo4j.annotation中的注释@Query提供了某些计数属性,如CountQuery、CountQueryName。 有人能解释一下这些的用法吗?更具体地说,我写了一个查询来获取关于一个主题的帖子。查询结果将被分页。下面的查询工作正常,并给我的结果。 现在我还需要结果的总数,我是否必须为此编写另一个查询,或者是否有一种方法可以容纳计数查
在SDN 6中,@Deapth注释被删除,在最新的6.0中也是如此。3、增加了对双向关系的支持。早些时候,它在保持相同节点实体之间的双向关系的同时提供StackOverflow。例如A-follows-
希望我的团队在这里做一些愚蠢的事情,但是,使用SDN 3.3对抗Neo4j 2.1.6,当我试图获取一个特定的实体时,我会得到一个持久性实体转换异常。 数据模型是这样的: 有一个基本节点实体模型,称之为a。它在SDN中是抽象的(它实际上是从其他几个类派生而来的,但根是@NodeEntity) 我正在执行一个Cypher查询,它有效地查找标签来自A(应该包括B和C)的节点。Java代码看起来有点像这
图像我有以下实体:公司和员工,带有Spring数据neo4j注释: Company.java 受雇者JAVA 然后是这些实体的关系实体: 那么如何保留和中的引用呢? Company.java 或 人JAVA 或