我已经与Meteor创建了一个简单的应用程序,以了解Neo4j和Meteor如何协同工作,使用Dmitriy Aristarkhovich的Neo4j Reactivity driver为流星。
当我使用Web客户端向Neo4j数据库添加新节点时,我看到在localhost:7474
的Neo4j浏览器中出现了两个节点。这些节点具有相同的_id
但不同的id
。我没有设置" _id"或" id"在任何地方,所以可能这是在Meteor,各种Neo4j包装和驱动程序以及Neo4j本身之间添加的东西。
一个节点显示为带有"标签",另一个节点没有。
在我创建一个名为" Room 1"的节点之后,这是我在ASCII视图中显示的内容。和标签" Room"。
[*(2)] [Room(1)]
(Room 1)
<id>:73 name:Room 1 _id:hLNZfesRg8mtPtyLW
( 75 )
<id>:75 name:Room 1 _id:hLNZfesRg8mtPtyLW
以下是“行”视图中显示的内容:
name Room 1
_id hLNZfesRg8mtPtyLW
name Room 1
_id hLNZfesRg8mtPtyLW
这里是代码: HTML
<body>
{{> addRoom}}
</body>
<template name="addRoom">
<h3>Add a Room</h3>
<input id="newRoomName" placeholder="Type name here">
<button class="button" id="addRoom">Add Room</button>
</template>
的JavaScript
var Rooms = Meteor.neo4j.collection("Rooms") // any collection name
var roomKey = "Rooms" // any publish-subscribe name
if (Meteor.isServer) {
var roomQuery = "MATCH (room:Room) RETURN room"
Rooms.publish(roomKey, publishRoomQuery)
function publishRoomQuery(){
return roomQuery
}
}
if (Meteor.isClient) {
Tracker.autorun(function trackDataChanges(){
var options = null // becomes `this` in the publishRoomQuery()
var link = "room" // object name, to link as MongoDB row(s).
var subscription = Rooms.subscribe(roomKey, options, link)
})
Template.addRoom.events({
'click #addRoom': function () {
var $input = $('#newRoomName')
var roomName = $input.val()
if(roomName){
Rooms.insert({ // THE LINE THAT CALLS NEO4J
name: roomName,
__labels: ':Room'
});
$input.val('');
}
}
})
}
这种行为是我应该期待的吗?我误解了一些基本的东西吗?或者这是否表明模块中存在与Meteor的Neo4j连接的错误?
注意:我已经按照我的应用程序here的方式安装了所有依赖项的方式,但我并不相信这就是问题所在。
修改
@MichaelHunger
我已将以下代码添加到Meteor.isServer
部分:
var constraint = "CREATE CONSTRAINT ON (room:Room) ASSERT room.name IS UNIQUE"
Meteor.N4JDB.query(constraint, null, constraintCallback)
function constraintCallback(error, data){
console.log(error, data)
}
但是,我仍然看到Meteor应用程序创建了两个节点。但是,当我在localhost:7474
的Neo4j浏览器中运行此查询时,一切都按预期工作:
CREATE (r:Room {name: "Room2"}) RETURN r
// /!\ Neo.ClientError.Schema.ConstraintViolation
// Node 80 already exists with label Room and property "name"=[Room 1]
所以看起来好像正确设置了约束,但是Neo4j Reactivity Driver以某种方式绕过了约束。