publish/subscribe 如何与 Meteor 的 Neo4j Reactivity 驱动程序一起工作
How does publish/subscribe work with the Neo4j Reactivity driver for Meteor
我正在开发一个 Meteor 应用程序,您可以在其中创建 Neo4j "Room" 节点和 "DOOR" 关系。每个房间应该只有一扇门通向任何其他给定房间。
我正在使用 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 风味 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>
这是在主菜单中选择房间 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
查询运行良好,但第二个查询产生一组空结果。
我怀疑 publish/subscribe 过程中有一些我不理解的基础知识。如果您能帮助我实现此功能,我将不胜感激。
完整项目可在此处获得:
git clone git@github.com:blackslate/Neo4j-issues.git
这可能不是 publish/subscribe 问题。尝试删除 {name}
参数周围的引号。
即变化:
"WHERE entrance.name = '{name}' "
至:
"WHERE entrance.name = {name} ".
我正在开发一个 Meteor 应用程序,您可以在其中创建 Neo4j "Room" 节点和 "DOOR" 关系。每个房间应该只有一扇门通向任何其他给定房间。
我正在使用 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 风味 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>
这是在主菜单中选择房间 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
查询运行良好,但第二个查询产生一组空结果。
我怀疑 publish/subscribe 过程中有一些我不理解的基础知识。如果您能帮助我实现此功能,我将不胜感激。
完整项目可在此处获得:
git clone git@github.com:blackslate/Neo4j-issues.git
这可能不是 publish/subscribe 问题。尝试删除 {name}
参数周围的引号。
即变化:
"WHERE entrance.name = '{name}' "
至:
"WHERE entrance.name = {name} ".