我正在开发一个Meteor应用程序,您可以在其中创建Neo4j“Room”节点和“DOOR”关系。每个房间应该只有一扇门通向任何其他给定的房间。
我正在使用Dmitriy Aristarkhovich的 Neo4j Reactivity驱动程序。
我想创建一个实时主从系统,用户所做的选择会影响到其他可选项。
为了说明这一点,在端口7474上的Neo4j浏览器中,我创建了一个简单的房间网络,如下图所示:
当主菜单中选择Room 3时,这些菜单应该是这个样子。
当我在Neo4j浏览器中测试这两个
我怀疑我没有理解发布/订阅过程的某些基本内容。如果能帮助我使此功能正常工作,我将不胜感激。
完整项目在此处可用:
我正在使用Dmitriy Aristarkhovich的 Neo4j Reactivity驱动程序。
我想创建一个实时主从系统,用户所做的选择会影响到其他可选项。
为了说明这一点,在端口7474上的Neo4j浏览器中,我创建了一个简单的房间网络,如下图所示:
CREATE
(a:Room {name: "Room 1"})
-[:DOOR]->
(b:Room {name: "Room 2"}),
a-[:DOOR]->
(c:Room {name: "Room 3"}),
b-[:DOOR]->a
RETURN a, b, c
在这个模式下:
- 房间1已经拥有它可以拥有的所有出门
- 房间2可以通过一扇门连接到房间3
- 房间3可以连接到房间1和房间2
我想展示两个下拉菜单:
- 一个主菜单选择门的起始房间
- 一个从属菜单,在给定起始房间的情况下选择可能的结束房间。
以下是我用于创建这些菜单的Meteor-flavour HTML:
<body>
{{> addDoor}}
</body>
<template name="addDoor">
<p>Add a Door from
<select id="fromRoomName">
{{#each fromRooms}}
{{> fromRoom}}
{{/each}}
</select>
to:
<select id="toRoomName">
{{#each toRooms}}
{{> toRoom}}
{{/each}}
</select>
</p>
</template>
<template name="fromRoom">
<option value="{{name}}">{{name}}</option>
</template>
<template name="toRoom">
<option value="{{name}}">{{name}}</option>
</template>
当主菜单中选择Room 3时,这些菜单应该是这个样子。
这是我正在使用的 JavaScript 代码:
var queries = {
"roomsForNewDoors": {
collection: Meteor.neo4j.collection("RoomsForNewDoors")
, query:
"MATCH (entrance:Room), (exit:Room) " +
"WHERE NOT (entrance)-[:DOOR]->(exit) " +
"AND entrance <> exit " +
"RETURN entrance"
, link: "entrance"
}
, "newDoorsForRoom": {
collection: Meteor.neo4j.collection("NewDoorsForRoom")
, query:
"MATCH (entrance:Room), (exit:Room) " +
"WHERE entrance.name = '{name}' " +
"AND NOT (entrance)-[:DOOR]->(exit) " +
"AND entrance <> exit " +
"RETURN exit"
, options: {name: "Room 2"}
, link: "exit"
}
}
if (Meteor.isServer) {
;(function (){
var queryKeys = Object.keys(queries)
queryKeys.forEach(publish)
function publish(key) {
var queryData = queries[key]
var query = queryData.query
var collection = queryData.collection
collection.publish(key, publishCallback)
function publishCallback(){
return query
}
}
})()
}
if (Meteor.isClient) {
Tracker.autorun(function createSubscriptions(){
var queryKeys = Object.keys(queries)
queryKeys.forEach(subscribe)
function subscribe(key) { //, index, array){
var queryData = queries[key]
var options = queryData.options
var link = queryData.link
var collection = queryData.collection
var subscription = collection.subscribe(key, options, link)
}
})
function getResults(queryData) {
var collection = queryData.collection
var cursor = collection.find()
return cursor
}
Template.addDoor.events({
'change #fromRoomName': function () {
var fromRoomId = $("#fromRoomName :selected").text()
Session.set("fromRoomId", fromRoomId)
}
})
Template.addDoor.helpers({
fromRooms: function() {
var results = getResults(queries.roomsForNewDoors)
return results
}
, toRooms: function () {
var key = "newDoorsForRoom"
var queryData = queries[key]
var options = { name: Session.get("fromRoomId") }
var link = queryData.link
var collection = queryData.collection
collection.subscribe(key, options, link)
var results = getResults(queryData)
return results
}
})
}
当我在Neo4j浏览器中测试这两个
MATCH
查询(例如,使用“Room 2”而不是'{name}'
),我得到了我预期的结果。使用Neo4j反应驱动程序,第一个MATCH
查询运行良好,但第二个查询产生了一组空结果。我怀疑我没有理解发布/订阅过程的某些基本内容。如果能帮助我使此功能正常工作,我将不胜感激。
完整项目在此处可用:
git clone git@github.com:blackslate/Neo4j-issues.git