public static void writeRdfProperty( Appendable w, String propName, RDFNode value, String padding, Map<String,String> standardNsAbbreviations, Map<String,String> usedNsAbbreviations )
		throws IOException
	{
		String propNodeName = XML.longToShort(propName, CCouchNamespace.standardNsAbbreviations, usedNsAbbreviations);
		
		if( value == null ) {
			// Then we just skip it!
		} else if( value.hasOnlySubjectUri() ) {
			w.append(padding + "<" + propNodeName + " rdf:resource=\"" + XML.xmlEscapeAttributeValue(value.subjectUri) + "\"/>");
		} else if( value.hasOnlySimpleValue() ) {
			if( value.simpleValue instanceof Collection ) {
				w.append(padding + "<" + propNodeName + " rdf:parseType=\"Collection\"");
				Collection<RDFNode> c = value.getItems();
				// In old style, empty list -> \t<List rdf:parseType="Collection">\n\t</List>
				// In new style, empty list -> \t<List rdf:parseType="Collection"/>
				if( c.size() > 0 ) {
					w.append(">\n");
					for( Iterator<RDFNode> i = c.iterator(); i.hasNext(); ) {
						writeRdfValue( w, i.next(), padding + "\t", standardNsAbbreviations, usedNsAbbreviations );
						w.append("\n");
					}
					w.append(padding + "</" + propNodeName + ">");
				} else {
					w.append("/>");
				}
			} else {
				w.append(padding + "<" + propNodeName + ">" + XML.xmlEscapeText(value.simpleValue.toString()) + "</" + propNodeName + ">");
			}
		} else {
			w.append(padding + "<" + propNodeName + ">\n");
			writeRdfValue( w, value, padding + "\t", standardNsAbbreviations, usedNsAbbreviations );
			w.append("\n" + padding + "</" + propNodeName + ">");
		}
	}